首页 > 其他分享 >Qt QML 虚拟键盘(VirtualKeyboard )

Qt QML 虚拟键盘(VirtualKeyboard )

时间:2024-02-26 20:14:05浏览次数:14  
标签:Qt parent 示例 键盘 QML import VirtualKeyboard anchors

简介

Qt 官方开源了一个虚拟键盘的示例,该示例提供两种使用方式:一种用于桌面平台,另一种用于嵌入式平台,示例采用嵌入式平台方式显示。它们区别是前者脱离窗口应用于全局,后者依附于窗口。

  • 示例在 QtCreator 软件可以找到:

  • 或在以下 Qt 安装目录找到:
C:\Qt\{你的Qt版本}\Examples\{你的Qt版本}\virtualkeyboard\basic
  • Qt 示例官方文档
https://doc.qt.io/qt-5/qtvirtualkeyboard-basic-example.html

使用

(1)先在 .pro 文件中添加插件:

1 QT += quickwidgets
2 CONFIG += link_pkgconfig
3 
4 # 使用静态插件
5 static {
6     QT += svg
7     QTPLUGIN += qtvirtualkeyboardplugin
8 }

(2)在 main.cpp 中添加以下代码,但要在QApplication a(argc, argv);前面:

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

(3)最后 QML 文件导入模块:

import QtQuick.VirtualKeyboard 2.1

然后 TetxInput 派生类的控件,获得焦点即可调出虚拟键盘(桌面平台)。

根据不同的输入方式显示不同的键盘

1 TextField {
2     id: digitsField
3     width: parent.width
4     placeholderText: "Digits only field" /* 输入为空时显示的提示文字 */
5     inputMethodHints: Qt.ImhDigitsOnly   /* 输入策略 */
6     enterKeyAction: EnterKeyAction.Next  /* 键盘确定键策略 */
7     onAccepted: textArea.focus = true    /* 结束输入操作行为 */
8 }

常用值有:

改写demo

这是我根据示例修改的一个 QML demo(嵌入式平台),代码如下:

  1 import QtQuick 2.10
  2 import QtQuick.Window 2.3
  3 import QtQuick.Controls 2.3
  4 import QtQuick.VirtualKeyboard 2.1
  5 import QtQuick.VirtualKeyboard.Settings 2.1
  6 
  7 Window {
  8     id: root
  9     visible: true
 10     width: 1000
 11     height: 600
 12     color: "#F6F6F6"
 13 
 14     // 使窗口强制获得焦点
 15     MouseArea {
 16         anchors.fill: parent
 17         onClicked: forceActiveFocus()
 18     }
 19 
 20     TextField {
 21         id: textUser
 22         placeholderText: "请输入用户名"
 23         font.family: "Microsoft YaHei"
 24         font.pixelSize: 28
 25         topPadding: 10
 26         anchors.top: parent.top
 27         anchors.topMargin: 40
 28         anchors.left: parent.left
 29         anchors.leftMargin: 40
 30 
 31         background: Rectangle {
 32             implicitWidth: 424
 33             implicitHeight: 50
 34             radius: 4
 35             border.color: parent.focus  ? "#498ff8" : "#C4DBFC"
 36         }
 37 
 38         // 当选择输入框的时候才显示键盘
 39         onPressed: {
 40             inputX = x
 41             inputY = y + height
 42             inputPanel.visible = true
 43         }
 44     }
 45 
 46     TextField {
 47         id: textPasswd
 48         placeholderText: "请输入密码"
 49         font.family: "Microsoft YaHei"
 50         font.pixelSize: 28
 51         topPadding: 10
 52         anchors.top: parent.top
 53         anchors.topMargin: 120
 54         anchors.left: parent.left
 55         anchors.leftMargin: 40
 56 
 57         background: Rectangle {
 58             implicitWidth: 424
 59             implicitHeight: 50
 60             radius: 4
 61             border.color: parent.focus  ? "#498ff8" : "#C4DBFC"
 62         }
 63 
 64         // 当选择输入框的时候才显示键盘
 65         onPressed: {
 66             inputX = x
 67             inputY = y + height
 68             inputPanel.visible = true
 69         }
 70     }
 71 
 72     property int inputX: 0 // 键盘x坐标(动态)
 73     property int inputY: root.height // 键盘y坐标(动态)
 74 
 75     // 嵌入式虚拟键盘
 76     InputPanel {
 77         id: inputPanel
 78         z: 99
 79         //更改x,y即可更改键盘位置
 80         x: textUser.x
 81         y: root.height
 82         //更改width即可更改键盘大小
 83         width: root.width - 100
 84         visible: false
 85 
 86         externalLanguageSwitchEnabled: false
 87 
 88         states: State {
 89             name: "visible"
 90             when: inputPanel.active
 91             PropertyChanges {
 92                 target: inputPanel
 93                 // 将键盘顶部放在屏幕底部会使其隐藏起来
 94                 x: inputX
 95                 y: inputY
 96             }
 97         }
 98 
 99         Component.onCompleted: {
100             //VirtualKeyboardSettings.locale = "eesti" // 复古键盘样式
101             VirtualKeyboardSettings.wordCandidateList.alwaysVisible = true
102         }
103 
104         // 这种集成方式下点击隐藏键盘的按钮是没有效果的,只会改变active,因此我们自己处理一下
105         onActiveChanged: {
106             if(!active) { visible = false }
107         }
108     }
109 
110 }

效果如下:

标签:Qt,parent,示例,键盘,QML,import,VirtualKeyboard,anchors
From: https://www.cnblogs.com/ybqjymy/p/18035068

相关文章

  • Qt Virtual Keyboard 自适应位置
    一.实现inputcontex.h增加如下内容:1Q_PROPERTY(QRectFinputItemGeometryREADinputItemGeometry)2QRectFinputItemGeometry();inputcontex.cpp增加如下内容:1QRectFInputContext::inputItemGeometry()2{3QWidget*pInputItem=(QWidget*)inputItem();4......
  • Qt Virtual Keyboard实现自适应悬浮键盘(多种方法详细记录)
    项目需求实现悬浮键盘,点击QLineEdit或QTextEdit自动弹出自适应悬浮键盘,尝试了以下几种方法后选择了修改QTVirtualKeyboard源码。在这里把其他方法/想法也列出来做一下记录。项目环境:QT5.13.2VS2017方法1:调用windows自带系统软件盘介绍windows自带软键盘分为......
  • Qt QML使用虚拟键盘示例(附完整源码)
    使用"虚拟键盘"注意(例子的Qt版本:5.12.4)注意一:     /*必须在main.cpp开始处加入如下代码,否则无法使用"虚拟键盘"*/     qputenv(“QT_IM_MODULE”,QByteArray(“qtvirtualkeyboard”)); 注意二:     键盘大小是根据宽度自动计算的,所以,应用程序应该只设置Inpu......
  • Qt 常用基础设置
    //右键菜单无效setContextMenuPolicy(Qt::NoContextMenu);//设置窗口背景透明setAttribute(Qt::WA_TranslucentBackground);//设置外框隐藏setWindowFlag(Qt::FramelessWindowHint);//设置无焦点setFocusPolicy(Qt::NoFocus);//设置lineEdit未输入字时显示文字l......
  • QT多线程实现-----问题解决及实现方式
    一、概述恰巧正在做一个多线程通信的项目,具体功能是与下位机交互和文件发送,在子线程中实现命令发送和文件传输。使用movetothread主要遇到以下几个问题:1.Socketnotifierscannotbeenabledordisabledfromanotherthread。2.子线程完成文件传输,发送信号......
  • Qt的拖拽操作例子
    本文是一个拖拽文本的例子。演示了如何把按钮的标题拖拽到文本编辑框里。Qt对拖拽的封装很好,QDrag对象简单易用。本文程序测试环境是VS2017和Qt5.9。下面是程序拖拽时的效果图,可以看出来拖拽的时候光标下方也显示了文本内容:头文件。本功能是在主窗口中实现的。下面代码里QtTest......
  • 项目实战:Qt监测操作系统cpu温度v1.1.0(支持windows、linux、国产麒麟系统)
    需求  使用Qt软件开发一个检测cpu温度的功能。  兼容windows、linux,国产麒麟系统(同为linux)Demo  windows上运行(需要管理员权限):    国产麒麟操作上运行(需要管理员权限):   功能描述v1.1.0windows上定时检测输出cpu温度。linux上定时检测输出cpu......
  • 用QTimeLine实现滑动动画
    一般在Qt实现动画可以用QAbstractAnimation的子类实现。这里给出一个不一样的例子实现动画,即用QTimeLine实现。功能是有一个QStackedWidget,它有两个子页面。默认显示第一页。点击“动画”按钮播放一段动画使页面第一页滑动到第二页,然后切换到第二页。程序测试环境是VS2017和Qt5.9......
  • 项目实战:Qt监测操作系统物理网卡通断v1.1.0(支持windows、linux、国产麒麟系统)
    需求  使用Qt软件开发一个检测网卡的功能。  兼容windows、linux,国产麒麟系统(同为linux)Demo  windows上运行:      国产麒麟操作上运行:     功能描述v1.1.0windows上实时检测出网卡通断(插拔,失联等情况)linux上实时检测出网卡通断(插拔,失联等......
  • 解决qtcreator在某次用sudo启动后,再次启动提示权限不足的问题
    现象:sudo./qtcreator启动qt,退出,再次启动打开项目提示"permissiondenied"这是因为第一次使用sudo权限启动QtCreator时,生成了一些配置文件或者临时文件,这些文件的所有者变成了root用户。因此,当你尝试以普通用户身份再次打开QtCreator时,会因为缺少对这些文件的访问......