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方法捕获应用的所有消息的更多相关文章

  1. PyQt学习随笔:自定义Qt事件可以使用的事件类型的常量值范围

    除了<PyQt学习随笔:Qt事件QEvent.type类型常量及其含义资料速查>介绍的Qt已经定义的事件外,Qt还支持自定义事件. 为了方便起见,可以使用 registerEventTyp ...

  2. PyQt学习随笔:自定义信号连接时报AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 如果使用自定义信号,一定要记得信号是类变量,必须在类中定义,不能在实例 ...

  3. PyQt学习遇到的问题:重写notify发送的消息为什么首先给了一个QWindow对象?

    在PyQt开发图形界面应用时,从QApplication派生的子类重写notify方法后(具体请参考<PyQt学习随笔:通过自定义类重写QApplication的notify方法捕获应用的所有消 ...

  4. PyQt学习随笔:Qt事件类QEvent详解

    QEvent类是PyQt5.QtCore中定义的事件处理的基类,事件对象包含了事件对应的参数. <Python & PyQt学习随笔:PyQt主程序的基本框架>介绍了PyQt程序通 ...

  5. PyQt学习随笔:Model/View开发时从Model相关类派生自定义类需要注意的问题

    在<PyQt学习随笔:重写setData方法截获Model/View中视图数据项编辑的注意事项>介绍的方法,从Model相关类派生自定义类,通过重写setData方法以获取View中数据的 ...

  6. PyQt学习随笔:重写setData方法截获Model/View中视图数据项编辑的注意事项

    根据<PyQt学习随笔:Model/View中视图数据项编辑变动实时获取变动数据的方法>可以重写从PyQt的Model类继承的setData方法来实时截获View中对数据的更改,但需要注意 ...

  7. PyQt学习随笔:Qt中Model/View中的怎么构造View匹配的Model

    老猿Python博文目录 老猿Python博客地址 在<PyQt学习随笔:Qt中Model/View相关的主要类及继承关系>介绍了Model/View架构的主要类,在实际使用时,view相 ...

  8. PyQt学习随笔:Model和View之间的数据互动过程

    在<PyQt学习随笔:Qt中tem Views(Model-Based)和Item Widgets(Item-Based)控件的用途和关系>中介绍了,Model用于存储数据,View用于展 ...

  9. PyQt学习随笔:Model/View开发时在view数据项中设置不同角色数据的方法

    在往Model中通过QStandardItem等类插入数据项时,除了实际插入的存储数据,还可以设置不同角色(请参考<PyQt学习随笔:Model/View中诸如DisplayRole的数据角色及 ...

随机推荐

  1. 20 HTTP1.0和HTTP1.1

    20 HTTP1.0和HTTP1.1 推荐: http://blog.csdn.net/elifefly/article/details/3964766 请求头Host字段,一个服务器多个网站 长链接 ...

  2. 【转载】图解Transformer(完整版)!

    在学习深度学习过程中很多讲的不够细致,这个讲的真的是透彻了,转载过来的,希望更多人看到(转自-张贤同学-公众号). 前言 本文翻译自 http://jalammar.github.io/illustr ...

  3. 在java9+版本中,接口的内容和注意

    1.成员变量其实就是常量,格式: [public] [static] [final] 数据类型 常量名称 = 数据值: 注意: 常量必须进行赋值,而且一旦赋值不能改变. 常量名称完全大写,用下划线进行 ...

  4. 流量控制--3.Linux流量控制的组件

    Linux流量控制的组件 流量控制元素与Linux组件之间的相关性: traditional element Linux component 入队列 修订:从用户或网络接收报文 整流 class 提供 ...

  5. Effective Modern C++ ——条款7 在创建对象时注意区分()和{}

    杂项 在本条款的开头书中提到了两个细节性问题: 1.类中成员初始化的时候不能使用小括号. 如: class A { int a(0);//错误 }; 2.对于原子性类别的对象初始化的时候不能使用= 如 ...

  6. 解决IE下readonly的Input光标选中的问题

    首先用unselectable="on"解决,但是这种方法bug太多, 屏蔽了input的onblur事件(也就是focus事件在Angualr下),所以只能用click事件来代替 ...

  7. Linux学习 - 02 使用 - Centos8 - 网络配置相关

    『Centos8 网络配置』 题外话:最近太忙,利用仅有的周末空闲时间记录点东西,草率了. 问题1:安装 Centos8.2 minimal 过程中,只是设置了 WiFi的静态IP,没有进行[以太网] ...

  8. 从维基百科等网站复制数据和公式到MathType里编辑

    在我们写论文的时候,经常会需要用一些实际案例以及数据,而这些数据和案例有很大一部分可以直接在网络上找到.但是有时候也会发现我们想要的内容和公式,从网页上复制粘贴后太模糊,不适合打印和投影.就需要我们将 ...

  9. DFS序专题

    牛客专题之DFS序 简介 dfs序: 每个节点在dfs深度优先遍历中的进出栈的时间序列,也就是tarjan算法中的dfn数组. 画个图理解一下: 这棵树的dfs序:1 3 2 4 2 5 6 7 6 ...

  10. Redis 基础设计结构之四 set(集合)

    Redis 有 5 种基础数据结构,分别为:string (字符串).list (列表).set (集合).hash (哈希) 和 zset (有序集合). 今天来说一下set(集合)这种存储结构,s ...