记录Qt 虚拟键盘样式修改与使用

文章目录

概述

一、使用虚拟键盘

二、项目文件定义

1.VirtualKeyboard.qml

2.main.qml

3.main.cpp

三、编译运行

1.编译

2.运行

3.运行效果

总结


概述

在 Qt 开发中,虚拟键盘是移动设备和嵌入式设备中常用的输入工具。本文将详细介绍如何通过 QML 修改虚拟键盘样式,并实现从 QML 界面跳转到 QWidget 设计的 UI 界面并将Qt程序移植到嵌入式Linux开发板。


一、使用虚拟键盘

Qt 提供了虚拟键盘模块,只需在.pro文件中添加

QT += virtualkeyboard

再在main.cpp中添加

qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));

即可在输入框中使用虚拟键盘,在将程序移植到嵌入式linux开发板时,发现点击输入框时,虚拟键盘会覆盖整个显示屏,如下,于是使用qml来修改虚拟键盘的样式就非常有必要。

二、项目文件定义

Qt 提供了 QtQuick.VirtualKeyboard 模块,用于在 QML 中集成虚拟键盘。使用者可通过使用qml文件来对虚拟键盘的样式进行修改,如下即为项目目录:

其中 VirtualKeyboard.qml为虚拟键盘样式定义,在main.qml中定义了登陆界面,用户点击登陆后即可跳转到基于Qwidget的form.ui界面,

1.VirtualKeyboard.qml

定义一个虚拟键盘的输入面板,并设置了其样式和行为。它位于屏幕底部,默认是隐藏状态,当激活时会平滑地显示出来。

import QtQuick 2.12
import QtQuick.VirtualKeyboard 2.2
import QtQuick.VirtualKeyboard.Settings 2.2

InputPanel {
    id: inputPanel
    z: 99
    y: parent.height // 默认隐藏
    width: parent.width
    visible: true

    states: State {
        name: "visible"
        when: inputPanel.active
        PropertyChanges {
            target: inputPanel
            y: parent.height - inputPanel.height
        }
    }

    transitions: Transition {
        from: ""
        to: "visible"
        reversible: true
        ParallelAnimation {
            NumberAnimation {
                properties: "y"
                duration: 250
                easing.type: Easing.InOutQuad
            }
        }
    }

    Component.onCompleted: {
        VirtualKeyboardSettings.styleName = "retro" // 复古样式
        VirtualKeyboardSettings.wordCandidateList.alwaysVisible = true
        VirtualKeyboardSettings.activeLocales = ["zh_CN", "en_US"] // 改为中文和英文
    }
}

2.main.qml

代码中创建了一个简单的登录界面,在点击输入框时,会弹出修改样式之后的虚拟键盘并且虚拟键盘占显示屏幕的一半,点击登录按键后跳转到基于QWidget的form.ui界面。

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Layouts 1.12
import QtQuick.Controls 2.5

Window {
    id: root
    visible: true
    width: 800
    height: 480
    title: qsTr("Demo")

    signal loginClicked() // 定义信号

    ColumnLayout {
        anchors.top: parent.top
        anchors.topMargin: root.height * 0.2
        anchors.horizontalCenter: parent.horizontalCenter
        spacing: 25

        RowLayout {
            spacing: 25

            Text {
                text: qsTr("用户名:")
                font.family: "微软雅黑"
                font.pixelSize: 20
            }
            TextField {
                id: usernameField
                placeholderText: "输入用户名.."
                font.family: "微软雅黑"
                font.pixelSize: 16
                Layout.preferredWidth: root.width * 0.25

                background: Rectangle {
                    radius: 4
                    border.color: parent.focus ? "#498ff8" : "#C4DBFC"
                }
            }
        }

        RowLayout {
            spacing: 25

            Text {
                text: qsTr("密   码:")
                font.family: "微软雅黑"
                font.pixelSize: 20
            }
            TextField {
                id: passwordField
                placeholderText: "输入密码.."
                font.family: "微软雅黑"
                font.pixelSize: 16
                Layout.preferredWidth: root.width * 0.25

                background: Rectangle {
                    radius: 4
                    border.color: parent.focus ? "#498ff8" : "#C4DBFC"
                }
            }
        }

        // 添加登录按钮
        Button {
            text: qsTr("登录")
            font.family: "微软雅黑"
            font.pixelSize: 16
            Layout.alignment: Qt.AlignHCenter
            onClicked: {
                root.loginClicked() // 触发信号
                root.hide() // 隐藏当前窗口
            }
        }
    }

    // 嵌入虚拟键盘
    Loader {
        id: keyboardLoader
        source: "VirtualKeyboard.qml"
        anchors.bottom: parent.bottom
        width: parent.width
    }
}

3.main.cpp

通过Qt框架整合了QML界面与后台逻辑,实现了高DPI支持、虚拟键盘的启用,并通过信号和槽机制连接了QML的交互与C++的业务逻辑。

#include <QApplication> // 替换 QGuiApplication
#include <QQmlApplicationEngine>
#include <QQuickWindow>
#include "form.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    // 启用虚拟键盘模块
    qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));

    QApplication app(argc, argv); // 使用 QApplication

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    // 获取 QML 主窗口
    QObject *rootObject = engine.rootObjects().first();
    QQuickWindow *mainWindow = qobject_cast<QQuickWindow*>(rootObject);

    // 创建 Form 界面
    Form form;
    QObject::connect(&form, &Form::backToLogin, [mainWindow, &form]() {
        form.hide();
        mainWindow->show();
    });

    // 连接 QML 登录按钮信号槽
    QObject::connect(rootObject, SIGNAL(loginClicked()), &form, SLOT(show()));

    return app.exec();
}

三、编译运行

1.编译

使用qmake,make对该项目进行编译并通过使用scp将执行文件挂载到IMX6ULL中,

2.运行

在嵌入式设备中执行该文件:

3.运行效果


总结

在 Qt 中使用虚拟键盘,并通过 QML 修改其样式,解决了虚拟键盘在嵌入式设备中覆盖全屏的问题。同时,实现了从 QML 界面跳转到 QWidget 设计的 UI 界面,并将程序成功移植到嵌入式 Linux 开发板。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/975000.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国产开源PDF解析工具MinerU

前言 PDF的数据解析是一件较困难的事情&#xff0c;几乎所有商家都把PDF转WORD功能做成付费产品。 PDF是基于PostScript子集渲染的&#xff0c;PostScript是一门图灵完备的语言。而WORD需要的渲染&#xff0c;本质上是PDF能力的子集。大模型领域&#xff0c;我们的目标文件格…

基于单片机的智能电表设计(论文+源码)

2.1 系统整体方案设计 本课题为基于单片机的电子式单项智能电表&#xff0c;在此设计如图2.1所示的系统总体架构&#xff0c;其采用STM32单片机作为主控制器&#xff0c;搭配外设HLW8032模块实现对电压&#xff0c;电流&#xff0c;功率因数&#xff0c;电能消耗等参数进行检…

Kafka在Windows系统使用delete命令删除Topic时出现的问题

在使用Windows的Kafka时&#xff0c;想要删除某一个主题&#xff0c;发现使用了delete之后会一直报警告。下面是我发现错误之后重新实测的Bug 先创建2个topic kafka-topics.bat --bootstrap-server localhost:9092 --topic test1 --createkafka-topics.bat --bootstrap-serve…

【部署优化篇十三】深度解析《DeepSeek API网关:Kong+Nginx配置指南》——从原理到实战的超详细手册

一、为什么需要API网关?从单体服务到微服务的必然选择 1.1 单体服务的痛点 想象一下早期的淘宝——所有功能(用户中心、商品管理、订单系统)都打包在一个巨型服务里。这样的架构存在三大致命问题: 单点故障:一旦服务崩溃,整个系统瘫痪扩展困难:每次发布都需要全量部署…

在一个集成的 SynMatrix-Ansys 设计工作流程中实现 3D 滤波器仿真

Synmatrix Technologies Inc.是Ansys 的技术合作伙伴&#xff0c;通过一体化 RF 滤波器设计和测试调整软件平台提供解决方案&#xff0c;该平台可与 Ansys HFSS 3D 高频电磁 (EM) 仿真软件配对&#xff0c;以减少开发时间、材料和运营成本、设计风险和产品故障。 典型的射频/微…

仿uni-segmented-control添加左右滑动效果

官网的选项卡没有左右滑动的效果&#xff0c;本身的样式也不太好看&#xff0c;所以封装了个简易的组件达到相同的效果&#xff0c;可自行修改css部分修改样式~ 封装组件效果如下 custom-segmented-control.vue <template><view class"container"><v…

LeetCode51

LeetCode51 目录 题目描述示例思路分析代码段代码逐行讲解复杂度分析总结的知识点整合总结 题目描述 N 皇后问题&#xff1a;将 n 个皇后放置在 n x n 的棋盘上&#xff0c;使得皇后彼此之间不能相互攻击&#xff08;即任何两个皇后不能在同一行、同一列或同一斜线上&#x…

Lineageos 22.1(Android 15)Launcer简单调整初始化配置

一、前言 Launcer的初始化配置主要在如下的xml文件夹下&#xff0c;默认读取的5x5 这里我们把device_profiles调整一下&#xff0c;然后新建一个default_workspace_my.xml作为我们自己的配置就行。 二、配置 注意Lineageos 的Launcer是在lineageos/packages/apps/Trebuchet…

2025.2.23机器学习笔记:PINN文献阅读

2025.2.23周报 一、文献阅读题目信息摘要Abstract创新点网络架构架构A架构B架构C 实验结论后续展望 一、文献阅读 题目信息 题目&#xff1a; Physics-Informed Neural Networks for Modeling Water Flows in a River Channel期刊&#xff1a; IEEE TRANSACTIONS ON ARTIFICI…

BGP配置华为——路径优选验证

实验拓扑 实验要求 实现通过修改AS-Path属性来影响路径选择实现通过修改Local_Preference属性来影响路径选择实现通过修改MED属性来影响路径选择实现通过修改preferred-value属性来影响路径选择 实验配置与效果 1.改名与IP配置 2.as300配置OSPF R3已经学到R2和R4的路由 3.…

蓝桥杯单片机基础部分——6、555定时器

前言 NE555是一个纯硬件的设计&#xff0c;旦硬件电路确定了&#xff0c;其功能也确定了&#xff0c;没有可编程的部分&#xff0c;也没什么好去理解的地方&#xff0c;如果理解不了就直接背代码&#xff0c;这里也不是很常考&#xff0c;大家了解一下就可以了&#xff0c;知道…

使用API有效率地管理Dynadot域名,为域名部署DNS安全拓展(DNSSEC)

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

一文讲解Redis中的混合持久化

一文讲解Redis中的混合持久化 在 Redis 中&#xff0c;RDB 持久化是通过创建数据的快照来保存数据的&#xff0c;而 AOF 持久化则是通过记录每个写入命令来保存数据的。 两种方式各有优缺点。RDB 持久化的优点是恢复大数据集的速度比较快&#xff0c;但是可能会丢失最后一次快…

Android JNI的理解与使用。

写在前面&#xff1a;Java相对于C/C来说是更高级的语言&#xff0c;隐藏了指针&#xff0c;可读性更高&#xff0c;更容易学习&#xff0c;但是无法直接操作硬件、运行速度较慢也是不可回避的硬伤。JNI就是Java官方定义的一套标准“接口”&#xff0c;用于Java和C/C之间互相调用…

使用Docker Desktop部署GitLab

1. 环境准备 确保Windows 10/11系统支持虚拟化技术&#xff08;需在BIOS中开启Intel VT-x/AMD-V&#xff09;内存建议≥8GB&#xff0c;存储空间≥100GB 2. 安装Docker Desktop 访问Docker官网下载安装包安装时勾选"Use WSL 2 instead of Hyper-V"&#xff08;推荐…

seacmsv9 SQL注入漏洞(报错注入)

一、海洋CMS简介 海洋cms是为解决站长核心需求而设计的视频内容管理系统&#xff0c;一套程序自适应电脑、手机、平板、APP多个终端入口&#xff0c;无任何加密代码、安全有保障&#xff0c;是您最佳的建站工具。——来自seacms官网&#xff08;简而言之就是专门搭建看片网站的…

网络运维学习笔记 017HCIA-Datacom综合实验01

文章目录 综合实验1实验需求总部特性 分支8分支9 配置一、 基本配置&#xff08;IP二层VLAN链路聚合&#xff09;ACC_SWSW-S1SW-S2SW-Ser1SW-CoreSW8SW9DHCPISPGW 二、 单臂路由GW 三、 vlanifSW8SW9 四、 OSPFSW8SW9GW 五、 DHCPDHCPGW 六、 NAT缺省路由GW 七、 HTTPGW 综合实…

基于Java+SpringBoot+Vue的前后端分离的火车订票管理系统

基于JavaSpringBootVue的前后端分离的火车订票管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&…

Java数据结构第十二期:走进二叉树的奇妙世界(一)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 目录 一、树型结构 1.1. 树的定义 1.2. 树的基本概念 1.3. 树的表示形式 二、二叉树 2.1. 概念 2.2. 两种特殊的二叉树 2.3. 二叉树的性质 2.4. 二叉树的存储 三、二叉树的基本操作 一、树型结构 1.…

flowable适配达梦数据库

文章目录 适配相关问题无法从数据库产品名称“DM DBMS”中推断数据库类型分析解决 构建ibatis SqlSessionFactory时出错&#xff1a;inStream参数为null分析解决 liquibase相关问题问题一&#xff1a;不支持的数据库 Error executing SQL call current_schema: 无法解析的成员访…