Qvirtualkeyboard使用及相关知识点

news2025/1/17 13:55:00

项目介绍

环境介绍:x86+银河麒麟v10 arm+银河麒麟v10

需求分析:在arm平台上(一个平板)运行qt程序需要使用软键盘,不会配置键盘和鼠标,故需要使用软键盘。

方案总结:

  • 使用自己开发或者从网上下载一个可用的软键盘及输入法包
  • 使用qt原生的qvirtualkeyboard模块来实现软键盘的功能
  • 平板本身安装了麒麟软键盘输入法,利用该输入法完成唤醒软键盘的功能

方案分析:

  1. 第一种方案自己研发耗时耗力,项目比较紧的情况下不推荐该种做法;从网上下载好用的软键盘及输入法,此种方案可行,但是美观及输入法的功能都有局限性,故用作备用方案。
  2. 若考虑采用麒麟软键盘输入法,但是在平板上运行程序后,qt程序有时无法环境该软键盘,需要通过键盘手动切换下输入法才可以,此种方法也不可行。
  3. 偶然看到qt本身有提供virtualkeyboard模块,经过了解后,软件的外观和输入法的功能都能满足项目需求,故采用qt提供的virtualkeyboard模块进行实现。

效果预览:

使用方法

很多朋友可能会又有这样的疑问,如果要使用qt提供的virtualKeyboard模块,应该要怎么做呢?其实很简单,有两个步骤:

  1. 首先确认的自己使用的qt是否编译或者安装了virtualkeyboard动态库,以我的库为例QTDIR/5.15.2/gcc_64/lib下存在libQt5VirtualKeyboard.so libQt5VirtualKeyboard.so.5 libQt5VirtualKeyboard.so.5.15 libQt5VirtualKeyboard.so.5.15.2
  2. 在main函数中最开始加入这样一句就可以了,然后编译运行,试试把。
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));

可能会遇到的问题

  • 很多时候我们会遇到一个模态弹窗(qdialog)弹出时,qvirtualkeyboard无法弹出或者弹出后点击软键盘没有任何反应,这是因为模态窗口的机制导致的,解决的思路是模态窗口默认情况下阻塞的范围是应用程序级别(Qt::ApplicationModal)的,即模态窗口弹出后,该窗口所属的应用程序其它部分都会被阻塞,无法操作。那除此之外还有一个级别即窗口级别(Qt::WindowModal),它的含义是该模态窗口仅会阻塞其祖先窗口对象,但是不会影响非其祖先窗口对象。解决方法就是在执行exec之前执行如下语句
dialog.setWindowModality(Qt::WindowModal);
  • 我的应用场景是利用qtwebengineView与qvirtualkeyboard一起使用,在qwebengineview下的控件获取焦点后弹出软键盘。这种情况下发生了一种现象:当我们在简体中文输入法下输入一个字符,正常情况下会在软键盘的上部出现一个汉字的候选项,然后用户需要通过鼠标或者触摸选择汉字并输入到对应的编辑框中,但是在qwebengineview下输入字符后却无法看到汉字候选项,而且文字会不经过选择自动输入到qwebengineview中的编辑框中,造成的后果是用户无法选择汉字了,这是一个很严重的问题。解决方法找了好久,终于找一个可用的,如下所示:

可以在qvirtualkeyboardinputcontext_p.cpp中的void QVirtualKeyboardInputContextPrivate::update(Qt::InputMethodQueries queries)函数中,注释掉
// update input engine
if ((newSurroundingText || newCursorPosition) &&
!testState(State::InputMethodEvent)) {
commit();
}
中的commit();语句即可,然后重新编译即可。qtwebengine运行时多次调用了update函数,而正常情况下没有调用,亲测有效!

  • 由于我是在linux下发开发,自己编译的qtcreator直接qvirtualkeyboard目录会导致崩溃,后来经过实验,可以直接打开virtualkeyboard目录即可。方法如下:(1)到qt官网下载单独的qtvirtualkeyboard模块,网址如下:Index of /archive/qt/5.15/5.15.2/submodules,下载qtvirtualkeyboard-everywhere-src-5.15.2.tar.xz包并解压,不知道为啥使用qt源码大包里面的qtvirtualkeyboard编译出来的会崩溃。(2)通过qtcreator进入目录qtvirtualkeyboard-everywhere-src-5.15.2/src/virtualkeyboard选择virtualkeyboard.pro打开即可,然后编译即可,编译输出的动态库在qtvirtualkeyboard-everywhere-src-5.15.2/lib路径下,然后生成的动态库拷贝到qt安装目录下即可,脚本如下所示:

 cp  -f libQt5VirtualKeyboard.so /opt/Qt/5.15.2/gcc_64/lib
 cp  -f libQt5VirtualKeyboard.so.5 /opt/Qt/5.15.2/gcc_64/lib
 cp  -f libQt5VirtualKeyboard.so.5.15 /opt/Qt/5.15.2/gcc_64/lib
 cp  -f libQt5VirtualKeyboard.so.5.15.2 /opt/Qt/5.15.2/gcc_64/lib
 cp  -f libQt5VirtualKeyboard.so.5.15.2.debug /opt/Qt/5.15.2/gcc_64/lib

  • 调整软件盘可拖动,默认情况下qvirtualkeyboard生成的软键盘是不能拖动的,如果有拖动的需求可以按照如下方式进行修改:(1)进入到qvirtualkeyboard的源码目录qtvirtualkeyboard-everywhere-src-5.15.2/src/virtualkeyboard/content,打开InputPanel.qml文件,改成如下方式

    SelectionControl {
        objectName: "selectionControl"
        x: -parent.x
        y: -parent.y
        enabled: active && !keyboard.fullScreenMode && !desktopPanel
    }
    property real mouseXTMP: 0
    property real mouseYTMP: 0
    MouseArea {
        anchors.fill: parent
        onPressed: {
            mouseXTMP = mouseX
            mouseYTMP = mouseY
        }
        onPositionChanged: {
            inputPanel.x = mouseX + inputPanel.x - mouseXTMP
            inputPanel.y = mouseY + inputPanel.y - mouseYTMP
        }
        enabled: active
    }

....

上面红色部分添加后即可支持拖动,然后重新编译拷贝到qt安装目录即可。

未解决的问题

  • 通过研究官方提供的用例basic,,发现在pro文件中添加“CONFIG += disable-desktop”后,软键盘弹出方式及软键盘的大小发生了变化,而且当界面变大时,软键盘遮挡输入框时,会自动在前面生成了一个大的输入区域,可以让用户看到输入的值是什么,这个功能我还没有添加到我的项目中。
  • 修改输入法的种类,默认的qvirtualkeyboard输入法种类特别,需要进行定制,不能要那么的种类
  • 探索是否有其他的方法可以修改软键盘的大小和拖动

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python爬虫-数据解析BeautifulSoup

1、基本简介 BeautifulSoup简称bs4,BeautifulSoup和lxml一样是一个html的解析器,主要功能也是解析和提取数据。 BeautifulSoup和lxml类似,既可以解析本地文件也可以响应服务器文件。 缺点:效率没有lxml的效率高 。 优点:接口设…

Vulnhub: Hogwarts: Bellatrix靶机

kali:192.168.111.111 靶机:192.168.111.228 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.228访问80端口 查看源码,提示ikilledsiriusblack.php和文件包含的参数名file 漏洞利用 ikilledsiriusblack.p…

实训笔记9.1

实训笔记9.1 9.1笔记一、项目开发流程一共分为七个阶段1.1 数据产生阶段1.2 数据采集存储阶段1.3 数据清洗预处理阶段1.4 数据统计分析阶段1.5 数据迁移导出阶段1.6 数据可视化阶段 二、项目的数据产生阶段三、项目的数据采集存储阶段四、项目数据清洗预处理的实现4.1 清洗预处…

50ETF期权开户平台(0门槛期权开户指南)

50ETF期权开户平台比较好的有:期权馆,期权科普馆,小熊期权,期权酱,财顺财经,财顺期权等,都是国内前十的期权分仓平台,下文为大家结算50ETF期权开户平台(0门槛期权开户指南…

【SpringSecurity】十一、SpringSecurity集成JWT实现token的方法与校验

文章目录 1、依赖与配置2、JWT工具类3、认证成功处理器4、创建JWT过滤器5、安全配置类 1、依赖与配置 添加JWT的maven依赖&#xff1a; <!-- 添加jwt的依赖 --> <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId…

专业协作设计工具,看看这6个有你喜欢的吗

如今“在线协作”成为了团队设计场景中必需的功能之一&#xff0c;今天本文整理了7个支持团队协作的&#xff0c;好用的设计工具&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是一个强大的在线设计协作工具&#xff0c;它具有实时协作设计和在线评论能力。在设…

干翻Dubbo系列第十四篇:Dubbo协议基于SpringBoot规范化开发

文章目录 文章说明 一&#xff1a;版本控制 二&#xff1a;共有依赖声明于父项目 三&#xff1a;创建共有API 1&#xff1a;定义公共接口 2&#xff1a;定义Bean 四&#xff1a;创建Provider 1&#xff1a;引入公共API 2&#xff1a;创建实现类 3&#xff1a;定义启动…

Mac 如何判断下载Mac with Intel Chip 还是 Mac with Apple Chip

如下图&#xff0c;当我们在 Mac系统 下载客户端时&#xff0c;有两种选择&#xff1a;Mac with Intel Chip 、 Mac with Apple Chip 如何判断要下载哪一种&#xff1f; 需要判断本机Mac是在Inter芯片还是Apple芯片上运行的。方法如下&#xff1a; 点击屏幕左上角Apple标志&a…

DVWA失效的访问控制

失效的访问控制&#xff0c;可以认为是系统对一些功能进行了访问或权限限制&#xff0c;但因为种种原因&#xff0c;限制并没有生效&#xff0c;造成失效的访问控制漏洞,比如越权等 这里以DVWA为例&#xff0c;先访问低难度的命令执行并抓包 删除cookie&#xff0c;并在请求头…

Ei Scopus双检索 | 2024年第二届绿色建筑国际会议(ICoGB 2024)

会议简介 Brief Introduction 2024年第二届绿色建筑国际会议(ICoGB 2024) 会议时间&#xff1a;2024年5月22日-24日 召开地点&#xff1a;意大利米兰 大会官网&#xff1a;www.icogb.org ICoGB 2024将围绕“绿色建筑”的最新研究领域而展开&#xff0c;为研究人员、工程师、专家…

Linux 进程基础概念-进程状态、进程构成、进程控制

Linux 进程 参考&#xff1a; 「linux操作系统」进程的切换与控制到底有啥关系&#xff1f; - 知乎 (zhihu.com)&#xff0c;Linux进程解析_deep_explore的博客-CSDN博客&#xff0c;腾讯面试&#xff1a;进程的那些数据结构 - 知乎 (zhihu.com)&#xff0c;如何在Linux下的进…

百万级并发IM即时消息系统(3)配置数据初始化和前后端交互

04_配置数据初始化及前后端交互_哔哩哔哩_bilibili 1.配置文件 创建一个config文件夹以及一个app.yaml配置文件。 该文件专门存放一些关键配置&#xff0c;如mysql DNS路径和redis的addr账号密码等。 后期可以创建一个工具包和一些初始化方法&#xff0c;专门用来加载这些配…

密码算法、密钥体系---安全行业基础篇1

一、密码算法 密码算法是一种数学和计算方法&#xff0c;用于保护数据的机密性和安全性。不同的密码算法使用不同的数学原理和技术来加密和解密数据。以下是一些常见的密码算法类型&#xff1a; 1. **对称密码算法&#xff1a;** 特点&#xff1a;相同的密钥用于加密和解密数…

14:00面试,14:08就出来了,问的问题有点变态

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

雅思写作 三小时浓缩学习顾家北 笔记总结(三)

目录 顾家北饥饿网100个句子翻译 "Heritage sites threatened by urban development" "Heritage sites are threatened by urban development." We should not ignore face-to-face communication. We cannot ignore face-to-face communication. So…

电商项目part09 分布式事务SeataMQ可靠消息

分布式事务 在微服务架构中&#xff0c;完成某一个业务功能可能需要横跨多个服务&#xff0c;操作多个数据库。这就涉及到到了分布式事务&#xff0c;需要操作的资源位于多个资源服务器上&#xff0c;而应用需要保证对于多个资源服务器的数据操作&#xff0c;要么全部成功&…

数据统计汇总聚合

一些方法 特殊&#xff1a;数据聚合 可加入排序

Leetcode: 1. 两数之和 【题解超详细】

前言 有人夜里挑灯看花&#xff0c;有人相爱&#xff0c;有人夜里开车看海&#xff0c;有人leetcode第一题都做不出来。 希望下面的题解可以帮助你们开始 你们的 leetcode 刷题 的 天降之路 题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中…

Linux配置ADSL链接

在Linux中配置ADSL链接&#xff0c;可以按照以下步骤进行&#xff1a; 安装rp-pppoeconf工具&#xff0c;这个工具可以通过终端窗口使用。运行命令“rp-pppoeconf”来配置ADSL链接。终端窗口会显示一个向导模式&#xff0c;用于配置ADSL链接。输入用户名和密码。这些信息是用来…

强强联手 | 大势智慧与山维科技签署战略合作协议

8月30日&#xff0c;武汉大势智慧科技有限公司&#xff08;以下简称“大势智慧”&#xff09;与北京山维科技股份有限公司&#xff08;以下简称“山维科技”&#xff09;达成战略合作。双方将聚焦新型基础测绘建设与实景三维中国领域&#xff0c;携手为广大用户提供数据采集、生…