PyQt学习随笔:通过自定义类重写QApplication的notify方法捕获应用的所有消息
PyQt程序通过调用QApplication类的exec_()(sys.exit(app.exec_()) 进入程序主循环,开始处理事件,它从事件队列中获取本地窗口系统事件,将它们转化为 QEvents,然后将转换后的事件发送给 QObjects对象。
在QApplication类中,真正负责事件分发处理的是QApplication类的notify方法(函数),该方法负责向接收者发送事件,返回接收事件对象的处理程序返回的值。请注意,对于发送到任何线程中的任何对象的所有事件,都会调用此方法。
对于某些类型的事件(例如鼠标和键事件),如果接收者对事件不感兴趣(例如,它返回false),则事件将传播到接收者的父级,依此类推,直至顶级对象。
因此从QApplication类派生自定义类并重写notify方法可以截获应用接收到的所有事件。
重写notify的语法:
notify(QObject receiver, QEvent event)
其中:
1、参数receiver表示将事件发送给谁;
2、event就是事件参数,如果不了解请参考《PyQt学习随笔:Qt事件类QEvent详解》的介绍;
3、返回值为receiver的事件处理方法的返回值,如果返回值是False表示不阻拦事件,将事件信息继续向下传递,如果返回True表示消费了事件。
案例代码:
class App(QApplication):
def notify(self, eventobject: QObject, event: QEvent):
"""
本次重写notify是为了截获应用的所有事件,并针对鼠标和键盘按下事件输出事件相关的信息
:param eventobject: 事件接收对象
:param event: 具体事件
:return: True表示事件已经处理,False表示没有处理,需要继续往下传递
"""
eventtype = event.type()
flag = False
if eventtype==QEvent.MouseButtonPress or eventtype==QEvent.KeyPress:flag=True
if flag:
print(f"***************in app notify,事件类型值={eventtype},事件接收者:\n{eventobject}")
ret = super().notify(eventobject, event)
if flag:print(f"***************in app notify,事件返回值={ret}")
return ret
当点击窗口的一个按钮时,上述代码输出信息如下:
***************in app notify,事件类型值=2,事件接收者:
<PyQt5.QtGui.QWindow object at 0x00000000034CE168>
***************in app notify,事件类型值=2,事件接收者:
<PyQt5.QtWidgets.QPushButton object at 0x00000000034CE288>
***************in app notify,事件返回值=True
***************in app notify,事件返回值=True
可以看到,一个按钮鼠标点击事件被传递了两次,首先传递给窗口,然后传递给了按钮。
注意:
1、如果重写此函数,则必须确保处理事件的所有线程在应用程序对象开始销毁之前停止执行此操作。这包括可能正在使用的其他库启动的线程,但不适用于qt自己的线程;
2、这个函数在Qt6规划的版本中将取消。
博客地址:https://blog.csdn.net/LaoYuanPython
老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/98245036
PyQt学习随笔:通过自定义类重写QApplication的notify方法捕获应用的所有消息的更多相关文章
- PyQt学习随笔:自定义Qt事件可以使用的事件类型的常量值范围
除了<PyQt学习随笔:Qt事件QEvent.type类型常量及其含义资料速查>介绍的Qt已经定义的事件外,Qt还支持自定义事件. 为了方便起见,可以使用 registerEventTyp ...
- PyQt学习随笔:自定义信号连接时报AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 如果使用自定义信号,一定要记得信号是类变量,必须在类中定义,不能在实例 ...
- PyQt学习遇到的问题:重写notify发送的消息为什么首先给了一个QWindow对象?
在PyQt开发图形界面应用时,从QApplication派生的子类重写notify方法后(具体请参考<PyQt学习随笔:通过自定义类重写QApplication的notify方法捕获应用的所有消 ...
- PyQt学习随笔:Qt事件类QEvent详解
QEvent类是PyQt5.QtCore中定义的事件处理的基类,事件对象包含了事件对应的参数. <Python & PyQt学习随笔:PyQt主程序的基本框架>介绍了PyQt程序通 ...
- PyQt学习随笔:Model/View开发时从Model相关类派生自定义类需要注意的问题
在<PyQt学习随笔:重写setData方法截获Model/View中视图数据项编辑的注意事项>介绍的方法,从Model相关类派生自定义类,通过重写setData方法以获取View中数据的 ...
- PyQt学习随笔:重写setData方法截获Model/View中视图数据项编辑的注意事项
根据<PyQt学习随笔:Model/View中视图数据项编辑变动实时获取变动数据的方法>可以重写从PyQt的Model类继承的setData方法来实时截获View中对数据的更改,但需要注意 ...
- PyQt学习随笔:Qt中Model/View中的怎么构造View匹配的Model
老猿Python博文目录 老猿Python博客地址 在<PyQt学习随笔:Qt中Model/View相关的主要类及继承关系>介绍了Model/View架构的主要类,在实际使用时,view相 ...
- PyQt学习随笔:Model和View之间的数据互动过程
在<PyQt学习随笔:Qt中tem Views(Model-Based)和Item Widgets(Item-Based)控件的用途和关系>中介绍了,Model用于存储数据,View用于展 ...
- PyQt学习随笔:Model/View开发时在view数据项中设置不同角色数据的方法
在往Model中通过QStandardItem等类插入数据项时,除了实际插入的存储数据,还可以设置不同角色(请参考<PyQt学习随笔:Model/View中诸如DisplayRole的数据角色及 ...
随机推荐
- tensorflow的广播机制
TensorFlow支持广播机制(Broadcast) TensorFlow支持广播机制(Broadcast),可以广播元素间操作(elementwise operations).正常情况下,当你想要 ...
- C++动态存储方式与静态存储方式
如果从变量值存在的时间(即生存期)来分,可将程序中的变量分为:动态存储方式和静态存储方式.它们所占用的存储空间区域不同. C++存储空间区域 代码区:存放可执行程序的程序代码.静态存储区:存放静态变量 ...
- impala-shell -o a.txt 查询中有中文时报错问题的处理
当使用impala-shell -o a.txt进入impala-shell之后,查询报错: 报错情况: Query: select * from dim_sales_dept Unknown Exc ...
- mysql之binlog和各类日志介绍
1.错误日志 错误日志作用: 记录MySQL的启动.停止信息以及在MySQL运行过程中的错误信息. 参数log_error(默认开启) 修改后重启生效 log_error=[path/[file_n ...
- centos使用U盘做启动盘
软件下载地址: http://sourceforge.net/projects/iso2usb/files/latest/download?source=dlp 写于: 2014年08月04日 更新于 ...
- [USACO14JAN]Ski Course Rating G
题目链接:https://www.luogu.com.cn/problem/P3101 Slove 这题我们可以尝试建立一个图. 以相邻的两个点建边,边的权值为两个点高度差的绝对值,然后把边按照边权值 ...
- [LeetCode题解]160. 相交链表 | 双指针 + 哈希表
方法一:双指针 解题思路 假设链表存在相交时,headA 的长度为 a + c,headB 的长度为 b + c.如果把 headA 连上 headB,headB 连上 headB 的话,当遍历这两个 ...
- Python 调用接口添加头信息
import requests,jsonurl = 'http://47.108.115.193:9000/tb-store/store/getWechatAppHome'header={" ...
- UnitTest_墨振文档
目录 一.框架介绍 1 二.四大组件 2 三.ddt数据驱动 3 一.框架介绍 unittest框架是python 自带的一个作为单元测试的测试框架,在最初叫pyUnit,相当与Java语言中的Jun ...
- Android light系统分析
光线系统包括:背光,闪光,led指示灯 一.内核层 Led-class.c (kernel-3.10\drivers\leds) 这个文件给HAL层提供接口 led_brightn ...