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

点网站建设qq群引流推广网站

点网站建设,qq群引流推广网站,discuz可以做门户网站吗,电商设计师联盟网站文章目录 前言:一、虚拟键盘的实现综合代码 二、为什么选用QWidget而不适用QDialog实现键盘三、从窗体a拉起窗体b后,窗体b闪退问题的探讨四、关闭主窗口时子窗口未关闭的问题 前言: 本文章主要包含四部分: 虚拟键盘的实现&#…

文章目录

    • 前言:
    • 一、虚拟键盘的实现
      • 综合代码
    • 二、为什么选用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 = 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()
http://www.hkea.cn/news/796767/

相关文章:

  • 安徽省建设业协会网站个人网页制作教程
  • 好的摄影网站推荐福州seo顾问
  • html做的好看的网站如何宣传推广产品
  • 微信手机网站制作怎么引流客源最好的方法
  • 宿州建设网站公司前端seo搜索引擎优化
  • 做王境泽表情的网站百度seo关键词优化排名
  • 怎么选择无锡网站建设虚拟主机搭建网站
  • 做原油期货关注什么网站搜索引擎优化是做什么
  • 微信小程序怎么制作游戏安卓优化清理大师
  • 胶南做网站初学者做电商怎么入手
  • 网站为什么要维护佛山网络营销推广
  • 国企网站建设报告怎么建造自己的网站
  • 免费做司考真题的网站余姚网站如何进行优化
  • 如何网站开发1688网站
  • 丽水专业网站建设价格青岛网站优化
  • 网站开发专业培训学校百度推广登录官网入口
  • 贵阳做网站公司网站热度查询
  • 做课件最好的素材网站考拉seo
  • 网站建设玖首选金手指seo网站优化收藏
  • 台州卓远做网站好不好广州seo教程
  • dz网站数据备份bt磁力猪
  • github 可以做网站吗360seo
  • 杭州 企业门户网站建设爱链
  • dj那个网站做的好长沙公司网络营销推广
  • 设计师培训招生视频黑帽seo联系方式
  • 做网上贸易哪个网站好西宁网站seo
  • 电子烟网站建设杯子软文营销300字
  • 广州企业网站制作怎么做营销推广
  • 网站建设服务器在香港郑州网站建设专业乐云seo
  • 河北建设工程交易信息网海口关键词优化报价