当前位置: 首页 > article >正文

记录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 开发板。


http://www.kler.cn/a/562502.html

相关文章:

  • 用Python写一个获取IP地址的脚本
  • android s下make otapackage编译失败
  • YOLOv10 解析与地平线 征程 6 模型量化
  • 中国AI科技崛起,资本市场投资正当时
  • 前端浏览器开发中的浏览器兼容问题【持续更新】
  • 软考高级【网络规划设计师】 综合知识
  • 【QT Quick】C++扩展QML类型
  • stm32-LCD(液晶显示器)
  • 【Matlab仿真】Matlab Function中如何使用静态变量?
  • rust笔记10-多线程
  • MySQL 8.0 Enterprise Backup (MEB) 备份与恢复实践指南
  • 力扣hot100 —— 电话号码字母组合; 子集 (非回溯做法)简单易懂
  • ctfshow做题笔记—栈溢出—pwn57~pwn60
  • 基数排序:独特的排序之道
  • C++和OpenGL实现3D游戏编程【连载23】——几何着色器和法线可视化
  • Vue3 + Vite + TS,使用 配置项目别名属性:resolve
  • 补题A-E Codeforces Round 953 (Div. 2)
  • 【Java】数据类型
  • Vue中环境配置的若干问题解决
  • opencv边缘检测