简易实现QT中的virtualkeyboard及问题总结

news2024/12/24 2:11:48

文章目录

    • 前言:
    • 一、虚拟键盘的实现
      • 综合代码
    • 二、为什么选用QWidget而不适用QDialog实现键盘
    • 三、从窗体a拉起窗体b后,窗体b闪退问题的探讨
    • 四、关闭主窗口时子窗口未关闭的问题

前言:

本文章主要包含四部分:

  1. 虚拟键盘的实现(基于Pyside2)
  2. 为什么选用QWidget而不适用QDialog实现键盘
  3. 关于从一个窗体a中拉起另一个窗体b后,窗体b闪退的问题探讨
  4. 关闭主窗口时子窗口未关闭的问题

由于qt5官方的virtualkeyboard库无法适用于公司的应用场景,于是需要手写一个virtual keyboard,目前是初步实现了,但是没有办法全局监听,希望后续能有实现全局监听的办法。


已实现功能:

  • 作为组件以keyboard.py 形式集成到项目中
  • 可切换大小写
  • 可按比例附着于屏幕下方
  • 项目内多组件共用(Keyboard需要作为单例类)
  • 符合真实键盘键位,支持部分特殊字符

待实现功能:

  • 全局监听

一、虚拟键盘的实现

从虚拟键盘的交互可以感知其应当作为一个窗体与用户进行交互,通常窗体用的较多的是QDialog和QWidget,由于QDialog会阻塞其他窗体的交互事件(似乎可以通过setModal设置模态或非模态,但是笔者尝试后不起作用),故这里选择QWidget。
—————
实现思路:

  1. QWidget作为键盘窗体
  2. QPushButton作为虚拟键盘的每个按键
  3. 模拟真实键盘键位,为每一行提供一个QHBoxLayout,设置一个父layout即QVBoxLayout将所有QHBoxLayout添加进去。
  4. 通过setGeometry设置窗体位于指定位置,使键盘每次出现即附着于屏幕下方
  5. 设置该类为单例类
  6. 通过组件点击事件激活虚拟键盘,这里重写了QLineEdit的点击事件mouseclickevent
  7. keyboard工具类
  8. 单例类装饰器

综合代码

代码结构:

  • 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 = None

    def ×××(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()

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

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

相关文章

【LeetCode-中等题】207. 课程表

文章目录 题目方法一:bfs广度优先 有向图的拓扑排序(入度)方法二:dfs 深度优先搜索 题目 此题就可以转换为,求一个有向图是否存在环; 存在环,拓扑排序得出的结果是不完整的, 如果不…

Vue+NodeJS上传图片到腾讯云Cos

一.前端Vue 1.选择图片 --HTML <input type"file" accept"image/*" change"handleFileChange"> <el-button size"large" click"changeAvatar">上传头像</el-button> //选择图片 function handleFileC…

⽹络与HTTP 笔试题精讲1

OSI七层与TCP/IP 这个就是OSI参考模型,⽽实际我们现在的互联⽹世界是就是这个理论模型的落地叫做TCP/IP协议 TCP的三次握⼿与四次挥⼿ 客户端想要发送数据给服务端,在发送实际的数据之前,需要先在两端之间建⽴连接,数据发完以后也需要将该连接关闭。建⽴连接的过程就是我们…

Visual Studio 新建类从默认internal改为public

前言 之前一直用的Resharp辅助编写C#代码&#xff0c;Resharp用起来的确方便不少&#xff0c;但是太消耗开发机内存了。重装电脑后&#xff0c;还是决定使用Visual Studio内置的功能。 默认情况下&#xff0c;Visual Studio 中生成一个类或接口是internal类型的&#xff0c;而…

让你忘了自己还戴着耳机,南卡OE Pro 00压开放式耳机

开放式耳机的好处很多&#xff0c;不入耳不会产生异物感&#xff0c;在户外运动可以时刻保持与外界连接更安全&#xff0c;也不会因为耳塞的卫生问题造成耳道感染&#xff0c;因此对于需要长时间佩戴耳机的户外运动&#xff0c;尤其对于一些患有耳道疾病的用户&#xff0c;需要…

LM-Infinite: 一种简单有效的大模型即时长度泛化,解决更长文本推理问题

深度学习自然语言处理 原创作者&#xff1a;qazw 论文&#xff1a;LM-Infinite: Simple On-the-Fly Length Generalization for Large Language Models地址&#xff1a;https://arxiv.org/abs/2308.16137 进NLP群—>加入NLP交流群 摘要 近年来&#xff0c;LLM在各个领域的性…

问道管理:A股休息时间表?

在股票买卖中&#xff0c;歇息时刻能够给股民们喘息的时机&#xff0c;也是一种标准和保证买卖的方法。那么&#xff0c;A股的歇息时刻是什么时分&#xff1f;为什么要有这样的歇息时刻&#xff1f;歇息时刻对股民和商场又有哪些影响呢&#xff1f;本文将从多个角度剖析A股的歇…

Day 41 动态规划part03 : 343. 整数拆分 96.不同的二叉搜索树

96. 不同的二叉搜索树 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1…

【耗时50天报告】南卡/韶音/cleer等开放式耳机最详测评,2023开放式耳机机皇花落谁家

随着移动互联网的发展,蓝牙耳机已成为大众生活中不可或缺的移动设备。在蓝牙耳机这一种类中,开放式蓝牙耳机以其超强的舒适、安全、便携等优势而备受关注。相比传统蓝牙耳机,开放式耳机只需一个小巧的主体直接挂在耳朵上,不会给耳部带来任何压迫感,具有出色的通风性和舒适性&am…

【AIGC专题】Stable Diffusion 从入门到企业级实战0402

一、概述 本章是《Stable Diffusion 从入门到企业级实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》第02节&#xff0c; 利用Stable Diffusion ControlNet Openpose模型精准控制图像生成。本部分内容&#xff0c;位于整个Stable Diffusion生…

文件系统与inode编号

文件描述符fd 0&1&2 Linux 进程默认情况会有3个缺省打开的文件描述符&#xff0c;分别是标准输入0&#xff0c; 标准输出1&#xff0c; 标准错误2. 0,1,2对应的物理设备一般是&#xff1a;键盘&#xff0c;显示器&#xff0c;显示器 所以输入输出还可以采用如下方式 …

晶圆键合对准机的原理与应用

一、晶圆键合设备的工作原理 1、 第一个晶圆面朝下置于晶圆对准设备卡盘并传送到对准机内&#xff1b; 2、对准机内&#xff0c;晶圆在Z轴方向上移动直到被顶部的传输夹具真空吸附固定&#xff1b; 3、被传输夹具固定的第一个晶圆将成为后续对准工艺的基准&#xff0c;确定所…

SAP 获取本机信息(IP及电脑名称)<转载>

原文链接&#xff1a;https://blog.csdn.net/JYH1999/article/details/126489974 导语&#xff1a;最近在做日志的东西&#xff0c;需要记录用户的IP&#xff0c;以及电脑名称&#xff0c;找了一下&#xff0c;SAP有两个类可以实现。 一、效果展示 二、代码 *&----------…

一文学会K8s集群搭建

环境准备 节点数量&#xff1a;2台虚拟机 centos7硬件配置&#xff1a;master节点内存至少3G&#xff08;2G后面在master节点初始化集群时会报错&#xff0c;内存不够&#xff09;&#xff0c;node节点可以2G&#xff0c;CPU至少2个&#xff0c;硬盘至少30G网络要求&#xff1…

双向圆周阵列及阵列间距调整

SOLIDWORKS提供的阵列功能是非常实用的快速建模功能&#xff0c;可以帮助我们快速的形成重复特征。在以往的版本中&#xff0c;无论是线性阵列还是其他阵列都提供了可以双向进行的阵列选项。也就是可以帮助我们保证两个方向的阵列属性。 今天我们要讲的是在圆周阵列中增加双向的…

【EPLAN】统一修改项目中字体大小

需求&#xff1a;当A3图框时&#xff0c;“设备标识符”等字体太小&#xff0c;影响查看图纸。需要统一调大。 通过“层管理”改变字体大小。 “项目数据”->“层管理” 找到需要改变字体的大小如“设备标识符”&#xff1a; Over。 效果&#xff08;2.5mm 调整到了 3.5mm&a…

我国元宇宙专利申请位列全球靠前,UTONMOS元宇宙游戏体验再升级

中青网报道 近日&#xff0c;2023年服贸会数字贸易发展趋势和前沿高峰论坛举办并发布了《中国元宇宙产业发展趋势洞察》报告。报告指出我国元宇宙相关专利申请量位列全球第二。 元宇宙是虚拟世界和现实世界融合的载体&#xff0c;正成为驱动数字经济发展和助力数字中国建设的重…

【python基础知识】0.print()函数

文章目录 前言print()函数无引号单引号的用法双引号的用法三引号的用法转义字符 变量和赋值变量的命名规范 下关预告 前言 Python就是一个能够帮你实现需求的工具&#xff0c;它更像是一把万能钥匙&#xff0c;决定用它来打开哪一扇门的&#xff0c;是你自己。 『千里之行&am…

2.1 PE结构:文件映射进内存

PE结构是Windows系统下最常用的可执行文件格式&#xff0c;理解PE文件格式不仅可以理解操作系统的加载流程&#xff0c;还可以更好的理解操作系统对进程和内存相关的管理知识&#xff0c;在任何一款操作系统中&#xff0c;可执行程序在被装入内存之前都是以文件的形式存放在磁盘…

阿里云2核4G服务器5M带宽五年租用价格表

阿里云2核4G服务器5M带宽可以选择轻量应用服务器或云服务器ECS&#xff0c;轻量2核4G4M带宽服务器297元一年&#xff0c;2核4G云服务器ECS可以选择计算型c7、c6或通用算力型u1实例等&#xff0c;买5年可以享受3折优惠&#xff0c;阿腾云分享阿里云服务器2核4G5M带宽五年费用表&…