简易实现QT中的virtualkeyboard及问题总结
文章目录
- 前言:
- 一、虚拟键盘的实现
- 综合代码
- 二、为什么选用QWidget而不适用QDialog实现键盘
- 三、从窗体a拉起窗体b后,窗体b闪退问题的探讨
- 四、关闭主窗口时子窗口未关闭的问题
前言:
本文章主要包含四部分:
- 虚拟键盘的实现(基于Pyside2)
- 为什么选用QWidget而不适用QDialog实现键盘
- 关于从一个窗体a中拉起另一个窗体b后,窗体b闪退的问题探讨
- 关闭主窗口时子窗口未关闭的问题
由于qt5官方的virtualkeyboard库无法适用于公司的应用场景,于是需要手写一个virtual keyboard,目前是初步实现了,但是没有办法全局监听,希望后续能有实现全局监听的办法。
已实现功能:
- 作为组件以keyboard.py 形式集成到项目中
- 可切换大小写
- 可按比例附着于屏幕下方
- 项目内多组件共用(Keyboard需要作为单例类)
- 符合真实键盘键位,支持部分特殊字符
待实现功能:
- 全局监听
一、虚拟键盘的实现
从虚拟键盘的交互可以感知其应当作为一个窗体与用户进行交互,通常窗体用的较多的是QDialog和QWidget,由于QDialog会阻塞其他窗体的交互事件(似乎可以通过setModal设置模态或非模态,但是笔者尝试后不起作用),故这里选择QWidget。
—————
实现思路:
- QWidget作为键盘窗体
- QPushButton作为虚拟键盘的每个按键
- 模拟真实键盘键位,为每一行提供一个QHBoxLayout,设置一个父layout即QVBoxLayout将所有QHBoxLayout添加进去。
- 通过setGeometry设置窗体位于指定位置,使键盘每次出现即附着于屏幕下方
- 设置该类为单例类
- 通过组件点击事件激活虚拟键盘,这里重写了QLineEdit的点击事件mouseclickevent
- keyboard工具类
- 单例类装饰器
综合代码
代码结构:
- keyboard.py 键盘实现
- keyboard_util.py 键盘工具类
- singleton_util.py 单例类装饰器类
- enjoy_edit.py QLineEdit示例组件
- main.py 主程序入口
注:代码虽使用PySide2,但修改PySide2为PyQt5也可运行
代码已放在github:
https://github.com/qilin02811/VirtualKeyboard
clone后即可运行,通过python3 main.py即可运行,需安装PySide2环境,如果是PyQt5环境,应将代码中的依赖修改为PyQt5
示意图:

点击文本框后即可拉起键盘,并且键盘附着于最下方
二、为什么选用QWidget而不适用QDialog实现键盘
由于QT程序一般有多个窗体,我们希望键盘不会被其他窗体阻塞,且我们也不希望键盘阻塞其他窗体,故上面代码所有窗体均为QWidget,而未使用QDialog。 使用QDialog要通过dialog.exec_()来拉起,否则不会处理窗口的事件。
并且,如果通过exec拉起QDialog,必须关闭该dialog后才会响应其他窗体,这是实际运行过程中应该避免的。
通过该键盘程序的编写,我更倾向于使用QWidget而不是QDialog。
三、从窗体a拉起窗体b后,窗体b闪退问题的探讨
由于在窗体a中,我通过w = QWidget() ,w.show()闪退,故考虑使用QDialog: q = QDialog() ,q.exec_()
但这样会产生一个问题,当处理键盘点击事件完成后,想要点击主窗口或其他子窗口事件需要先关闭键盘,这不符合我们平常的使用场景,我们不希望键盘阻塞其他窗口,于是又放弃了QDialog,回到QWidget研究闪退问题。
这里给出一段解决闪退问题的示例:
发生闪退问题的代码:
class ×××(QWidget):def __init__():super().__init()def ×××(self):w = QWidget()w.show()
未发生闪退问题的代码:
class ×××(QWidget):def __init__():super().__init()self.w = Nonedef ×××(self):if self.w is None:self.w = QWidget(self)self.w.show()
推测:第一个代码由于w.show()后,整个解释器中就不存在w的引用,则w.show()后会清除w的实例
第二个代码由于有self.w = None的引用,故self.w.show()后不会清除self.w的实例
四、关闭主窗口时子窗口未关闭的问题
编写窗体程序时,经常出现多个窗体需要逐一关闭的情况,我们希望关闭主窗口时能够关闭所有子窗口,可以通过重写closeEvent实现:
# 逐个关闭所有子widget
def closeEvent(self, event):for widget in QApplication.instance().allWidgets():if widget != self and isinstance(widget, QWidget):widget.close()event.accept()
相关文章:
简易实现QT中的virtualkeyboard及问题总结
文章目录 前言:一、虚拟键盘的实现综合代码 二、为什么选用QWidget而不适用QDialog实现键盘三、从窗体a拉起窗体b后,窗体b闪退问题的探讨四、关闭主窗口时子窗口未关闭的问题 前言: 本文章主要包含四部分: 虚拟键盘的实现&#…...
景联文科技可为多模态语音翻译模型提供数据采集支持
8月22日Facebook的母公司Meta Platforms发布了一种能够翻译和转录数十种语言的人工智能模型——SeamlessM4T,可以在日常生活中或者商务交流中为用户提供更便捷的翻译和转录服务。 相较于传统的文本翻译,这项技术的最大区别在于它可以实现端到端的语音翻译…...
定时器分批请求数据
<!DOCTYPE html> <html><script>//需要分页的数组let arr [1,2,3,4,5,6,7,8,9,10]//分割数组,每页3条splitArr(arr,4)/*** 分割数组*/function splitArr(idList,size){//当前页数let num 1//共多少页let count Math.ceil(idList.length / siz…...
【华为OD机试python】报数游戏【2023 B卷|100分】
【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 100个人围成一圈,每个人有一个编码,编号从1开始到100。 他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数, 直到剩余的人数小于M。 请问最后剩余的人在原先…...
【深度学习实战—6】:基于Pytorch的血细胞图像分类(通用型图像分类程序)
✨博客主页:米开朗琪罗~🎈 ✨博主爱好:羽毛球🏸 ✨年轻人要:Living for the moment(活在当下)!💪 🏆推荐专栏:【图像处理】【千锤百炼Python】【深…...
华清远见第六课程day4作业
仿照string类,完成myString 类 #include <iostream> #include <cstring>using namespace std;class myString{ private:char *str;int size; public:myString():size(10){str new char[size];strcpy(str,"");}myString(const char*s){size …...
【广州华锐互动】AR远程智慧巡检在化工行业中的应用
AR远程智慧巡检是一种基于增强现实技术的新型巡检方式,它可以利用虚拟信息和现实场景的结合,实现对设备、工艺流程等方面的实时监测和识别。在化工行业中,AR远程智慧巡检具有广泛的应用前景,可以提高生产效率和安全性。 一、设备巡…...
easyui-sidemenu 菜单 后台加载
前言 一个项目的功能较齐全,而齐全就预示着功能菜单比较长,但是现实中在不同的甲方使用中往往只需要摘取其中几项功能,所以就想到用配置菜单以满足其需求,且无需变更原始代码,查找一些资料总是似是而非或是誊抄别的什…...
Python总结上传图片到服务器并保存的两种方式
一、前言 图片保存到服务器的两种方法: 1、根据图片的 URL 将其保存到服务器的固定位置 2、根据 request.FILES.get("file") 方式从请求中获取上传的图片文件,并将其保存到服务器的固定位置 二、方法 1、图片的 URL 要根据图片的 URL 将…...
【ETH】以太坊合约智能合约逆向方案
技术角度了解区块链 区块链技术逆袭专栏 文章目录 区块链技术逆袭专栏获取合约代码逆向工具方案1方案2实操演示:获取合约代码 在反编译之前,你需要先知道如果获取编译后的字节码。 这里以 USDT 举例 eth.getCode(0xdAC17F958D2ee523a2206206994597C13D831ec7)字节码: 0x…...
C高级Day5
课后作业: rootlinux:~/shell# cat qh.sh #!/bin/bash function sum_array() {local brr($*) local sum0for i in ${brr[*]} dosum$((sum i))doneecho $sum } arr(1 2 3 4 5) result$(sum_array ${arr[*]}) echo "数组的和为: $result"#!/bin/bash fun…...
AI绘画:Midjourney超详细教程Al表情包超简单制作,内附关键词和变现方式
大家好,本篇文章主要介绍AI绘画完成表情包的制作和变现方式分享。 你还不会AI表情包制作吗?下面我们详细的拆解制作过程。跟着这个教程做出一套属于自己的表情包。 核心工具Midjourney PS,你就可以得到一套自己的专属表情包啦~ 整体制作…...
Linux dup dup2函数
/*#include <unistd.h>int dup2(int oldfd, int newfd);作用:重定向文件描述符oldfd 指向 a.txt, newfd 指向b.txt,调用函数之后,newfd和b.txt close,newfd指向a.txtoldfd必须是一个有效的文件描述符 */ #include <unistd.h> #i…...
设计模式系列-外观模式
一、上篇回顾 上篇我们主要讲述了创建型模式中的最后一个模式-原型模式,我们主要讲述了原型模式的几类实现方案,和原型模式的应用的场景和特点,原型模式 适合在哪些场景下使用呢?我们先来回顾一下我们上篇讲述的3个常用的场景。 1…...
DBeaver 下载、安装与数据库连接(MySQL)详细教程【超详细,保姆级教程!!!】
本文介绍DBeaver 下载、安装与数据库连接(MySQL)的详细教程 一、DBeaver 下载 官网下载地址:https://dbeaver.io/download/ 二、安装 1、双击下载的安装包,选择中文 2、点击下一步 3、点击我接受 4、如下勾选,…...
使用adjustText解决标签文字遮挡问题python
使用adjustText解决文字遮挡问题 1、一个例子2、adjust_text的用法使用pip install adjustText或conda install -c conda-forge adjusttext来安装adjustText。安装成功之后,首先生成随机示例数据以方便之后的演示: 1、一个例子 我们先不使用adjustText调整图像,直接绘制出原…...
[论文笔记]SiameseNet
引言 这是Learning Text Similarity with Siamese Recurrent Networks的论文笔记。 论文标题意思是利用孪生循环神经网络学习文本相似性。 什么是孪生神经网络呢?满足以下两个条件即可: 输入是成对的网络结构和参数共享(即同一个网络)如下图所示: 看到这种图要知道可能代…...
只有个体户执照,可以用来在抖音开店吗?抖店开通问题解答
我是王路飞。 在抖音开店的门槛,本身就是需要有营业执照的。 至于执照的类型,其实主要看商家自己。 如果你是新手商家,之前也没有怎么接触过电商行业,那么用个体执照在抖音开店足够用了,毕竟你要先入门,…...
微服务高可用容灾架构设计
导语 相对于过去单体或 SOA 架构,建设微服务架构所依赖的组件发生了改变,因此分析与设计高可用容灾架构方案的思路也随之改变,本文对微服务架构落地过程中的几种常见容灾高可用方案展开分析。 作者介绍 刘冠军 腾讯云中间件中心架构组负责…...
记录docker 部署nessus
1、开启容器 docker run -itd --nameramisec_nessus -p 8834:8834 ramisec/nessus 2、登录 :注意是https https://ip8843 3、修改admin密码 #进入容器 docker exec -it ramisec_nessus /bin/bash#列出用户名 /opt/nessus/sbin/nessuscli lsuser#修改密码&a…...
抽水蓄能电站岔管结构智能优化【附模型】
✨ 长期致力于抽水蓄能、球形钢岔管、智能优化、鲸鱼算法、静力分析研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)球形钢岔管参数化有限元建模&…...
什么是自动化测试?工具、类型与最佳实践完全指南
自动化测试已经成了现代 QA 团队的默认工作方式。与其花上好几个小时手动点击按钮、填写表单、反复检查缺陷(结果还是在生产环境漏掉一个),测试人员更愿意写一次脚本,剩下的交给机器。脚本可以模仿用户操作、标记问题,把原本消耗在重复劳动上的时间还给团队,让大家去做更…...
5分钟掌握中兴光猫配置解密:解决网络维护难题的终极方案
5分钟掌握中兴光猫配置解密:解决网络维护难题的终极方案 【免费下载链接】ZET-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/ze/ZET-Optical-Network-Terminal-Decoder 你是否曾经面对加密的中兴光猫配置文件束手无策&#…...
2026公考培训机构综合评测:粉笔教育领跑,线上线下一体化成关键优势
【评测说明】 2026年公考培训市场持续分化,考生在选择机构时,不再只看“名师”或“价格”,而是综合考量上榜概率、资金安全、学习便捷性。本文从上岸数据可验证性、性价比、退费效率、师资体系稳定性、线上线下覆盖能力五大维度,对…...
从论文复现到算法创新:我是如何利用VRP标准算例搞定实验对比的
从论文复现到算法创新:VRP标准算例的实战应用指南 在算法研究领域,车辆路径问题(VRP)一直是组合优化中的经典难题。每当我翻开顶级期刊论文,总会被那些漂亮的实验结果所吸引——精确到小数点后三位的优化率、清晰的收敛曲线、严谨的统计检验。…...
python访问sqlite(sqlalchemy)(orm方式)
文章目录sqlalchemy的理解Base declarative_base()的作用?__repr__方法查询db.query()并不是查询,query.count()和query.offset()才是查询?查询-拼接条件分组关联查询新增修改删除安装依赖开始接触sqlalchemy不太习惯,感觉有点抽象。后来换个视角瞬间…...
5个颠覆性技巧:用GanttProject开源甘特图工具让你的项目管理效率提升200%
5个颠覆性技巧:用GanttProject开源甘特图工具让你的项目管理效率提升200% 【免费下载链接】ganttproject Official GanttProject repository. 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject 你是否曾为项目延期而焦虑?是否在任务分配…...
别再死记硬背公式了!用“预测-更新”的贝叶斯视角,5分钟看懂卡尔曼滤波核心
卡尔曼滤波:用贝叶斯思维解决自动驾驶中的不确定性追踪问题 想象一下你正驾驶一辆特斯拉行驶在高速公路上,车载雷达显示前方100米处有一辆卡车。但下一秒雷达数据突然跳变到105米,而摄像头却显示距离是98米。作为人类司机,你会本能…...
Cursor Pro破解工具完整指南:如何绕过限制实现永久免费使用
Cursor Pro破解工具完整指南:如何绕过限制实现永久免费使用 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached you…...
长期使用Taotoken后对账单追溯与审计功能的实际评价
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken后对账单追溯与审计功能的实际评价 在持续使用大模型服务进行项目开发与团队协作的过程中,成本的可观…...
