PyQt学习随笔:通过自定义类重写QApplication的notify方法捕获应用的所有消息

本文深入探讨了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

企业创新活动具有投入周期长、不确定性高和收益实现滞后等特征,持续稳定的资源支持是保障企业长期创新的重要基础。耐心资本作为一种强调长期价值创造、具备较高风险容忍度并积极参与企业治理的资本形态,能够通过缓解融资约束、优化公司治理结构以及增强企业风险承担能力,为企业持续开展创新活动提供长期稳定支持 本文基于2010—2024年中国A股上市公司样本数据,借鉴《耐心资本对企业持续性创新投入的影响研究》一文中的基准回归设计思路和研究方法,围绕“耐心资本是否能够促进企业持续性创新投入”这一问题展开基准回归实证检验,基准回归结果显示,耐心资本能显著促进企业持续性创新,数据集含原始数据、处理代码、基准回归实证结果 关键指标构建: 1.耐心资本:本文从稳定型股权和关系型债权两个维度刻画企业耐心资本水平,并采用熵权法对两个指标进行加权整合,构建综合耐心资本指数。其中,稳定型股权参考温磊和李思飞(2024)的研究,以长期机构投资者持股比例作为衡量指标;关系型债权参考吴旻佳(2022)、姜中裕(2024)的研究,采用上市公司长期负债占负债总额的比例衡量 2.企业持续性创新:基于研发投入三期动态变化构建,借鉴何郁冰(2017)、杨仁发(2025)的研究思路,计算第t-1至t年研发投入之和与第t-2至t-1年研发投入之和的比值,再将该比值乘以第t-1至t年研发投入之和,以此反映企业在创新投入上的持续性特征 相关数据:上市公司耐心资本数据,上市公司耐心资本投资数据,上市公司研发投入与专利数据 一、数据介绍 数据名称:耐心资本对企业持续性创新投入的影响研究 数据范围:上市公司企业 时间范围:2010-2024年 样本数量:31725条 数据来源:上市公司年报 数据说明:含原始数据、处理过程dofile文件、基准回归结果
内容概要:本文聚焦于语音增强领域的组稀疏信号去噪技术,深入研究了结合非凸正则化与凸优化的先进去噪方法,并提供了完整的Matlab代码实现方案。研究通过构建组稀疏信号模型,设计高效的非凸正则项以增强稀疏性表达能力,进而将其融入凸优化框架中求解,从而在复杂噪声环境下有效提升语音信号的清晰度与质量。文章不仅详述了算法的数学推导与优化求解流程,还突出了该方法在保留语音关键特征的同时抑制噪声的优越性能。此外,文档还列举了多个相关科研方向,展现出信号处理与优化理论在智能优化、机器学习、电力系统等多学科交叉应用中的广阔前景。; 适合人群:具备信号处理、优化理论或机器学习基础知识,从事语音增强、通信工程、电子信息、自动化等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:① 深入理解非凸正则化在稀疏信号恢复中的理论优势与实现机制;② 实践并复现组稀疏信号去噪算法,开展不同噪声条件下的性能对比实验;③ 利用Matlab平台完成语音增强相关的科研课题、课程设计或算法开发。; 阅读建议:建议读者结合文中的Matlab代码进行动手实践,重点关注目标函数的构造、优化算法的迭代过程及参数调优策略。初学者应先夯实稀疏表示与凸优化的基础知识,再循序渐进地掌握非凸正则化的核心思想与实现细节,以充分发挥该方法的技术潜力。
Cloudflare Computer 是一个运行在 Durable Object 内部的虚拟文件系统。Durable Object 通过 SQLite 保存权威状态,并通过 workspace.runtime 提供一个可插拔的执行接口。目前提供三种后端: 容器(Container):将 SQLite 状态通过 FUSE 挂载到沙箱容器中。沙箱侧的守护进程(computerd)将状态挂载为文件系统,并通过 capnweb RPC 通道同步变更。完整的 Linux 用户空间、真实的二进制文件、真实的网络环境。 隔离壳(Isolate shell):在动态 Worker 中运行 just-bash。它通过 Workers RPC 访问权威工作区,因此不存在第二个存储或同步往返。 隔离 JavaScript(Isolate JavaScript):在全新的动态 Worker 中运行 ECMAScript 模块,支持结构化输入/结果、持久化相对导入、配置库、工作区支持的 node:fs/promises,以及受信任的 ws:git 和 ws:artifacts 模块。 工作区可以在稳定 ID 下注册多个后端。workspace.runtime.exec(source, { backend }) 是唯一的执行入口点;所选后端决定 source 是 shell 命令还是 ECMAScript 模块。后端在首次使用时延迟连接。 工作区也可以完全不依赖后端构建,仅向调用者提供文件系统本身。 Important 仅预览版 此软件包仅作为预览版提供,用于收集反馈。API 不稳定,设计可能会发生变化。 适用于实验、探索和原型开发。目前不适合用于生产环境。 docs/ 目录下的规范具有前瞻性——请将其视为设计意图,而非当前代码的描述。 使用方法 如果您想基于 Cloudflare C
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值