浅析pyqt事件机制

pyqt事件机制

一、什么是pyqt事件机制?

​ 事件是指用户操作或系统发生的各种动作,比如鼠标点击、键盘输入、窗口大小变化等。事件可以由用户或操作系统触发,然后被传递给应用程序进行处理。PyQt的事件机制通过事件循环(Event Loop)和事件过滤器(Event Filter)来实现。

​ 事件循环是PyQt应用程序的核心机制,它负责接收事件、分发事件和调用对应的事件处理函数。事件循环不断地从操作系统接收事件,并将它们分发给应用程序的对象。每个对象都可以通过重写对应的事件处理函数来响应不同类型的事件。

​ 事件过滤器允许应用程序在事件到达目标对象之前对事件进行拦截和处理。通过设置事件过滤器,应用程序可以截获事件并在处理前进行一些操作,比如修改事件的属性、过滤掉不需要的事件等。

​ 总之,信号与槽机制是对事件机制的高级封装,事件机制更偏向于底层。

二、图解事件机制的流程

注:由于是浅析,不对事件过滤做过多描述,会在后续再进行详细研究。

1、循环检查消息队列

在这里插入图片描述

  1. 不断的按顺序检测消息队列中是否有消息
  2. 如果发现”事件消息”,则会包装成“QEvent 对象”进行分发处理
2、单次循环流程

在这里插入图片描述

三、利用代码简单演示事件机制流程

1、基础代码
import sys
from PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()btn = QPushButton(window)
btn.setText("自定义按钮")
btn.move(100, 100)def onPressed():print("按钮被点击了")btn.pressed.connect(onPressed)window.show()sys.exit(app.exec_())

程序实现的基本功能:自定义一个按钮,点击后在控制台打印信息。如下为演示图:

在这里插入图片描述

2、重写QApplication的notify方法
  1. 修改的代码:

    import sys
    from PyQt5.Qt import *# 添加自定义类,继承QAoolication,重写notify方法
    class MyApp(QApplication):def notify(self, receiver, evt) -> bool:# 由于事件比较多,需要过滤一些事件if receiver.inherits("QPushButton") and evt.type() == QEvent.MouseButtonPress:print("1. 鼠标被按下了,evt:", evt)return super(MyApp, self).notify(receiver, evt)app = MyApp(sys.argv)#修改为自己的类window = QWidget()btn = QPushButton(window)
    btn.setText("自定义按钮")
    btn.move(100, 100)def onPressed():print("按钮被点击了")btn.pressed.connect(onPressed)window.show()sys.exit(app.exec_())
    
  2. 演示图:
    在这里插入图片描述

3、重写QPushButton的event方法
  1. 修改的代码:

    import sys
    from PyQt5.Qt import *class App(QApplication):def notify(self, recevier, evt):if recevier.inherits("QPushButton") and evt.type() == QEvent.MouseButtonPress:print(recevier, evt)return super().notify(recevier, evt)class Btn(QPushButton):def event(self, evt):if evt.type() == QEvent.MouseButtonPress:print(evt)return super().event(evt)def mousePressEvent(self, *args, **kwargs):print("鼠标被按下了......")# return super().mousePressEvent(*args, **kwargs)app = App(sys.argv)window = QWidget()btn = Btn(window)
    btn.setText("按钮")
    btn.move(100, 100)def cao():print("按钮被点击了")btn.pressed.connect(cao)window.show()sys.exit(app.exec_())
    
  2. 演示图:
    在这里插入图片描述

4、重写QPushButton的mousePressEvent方法
  1. 修改的代码:

    import sys
    from PyQt5.Qt import *# 添加自定义类,继承QAoolication,重写notify方法
    class MyApp(QApplication):def notify(self, receiver, evt) -> bool:# 由于事件比较多,需要过滤一些事件if receiver.inherits("QPushButton") and evt.type() == QEvent.MouseButtonPress:print("1. 鼠标被按下了,evt:", evt)return super(MyApp, self).notify(receiver, evt)# 添加自定义按钮类,继承QPushButton,重写event方法
    class MyBtn(QPushButton):def event(self, event) -> bool:if event.type() == QEvent.MouseButtonPress:print("2. 鼠标被按下了,evt:", event)return super(MyBtn, self).event(event)#重写mousePressEvent方法def mousePressEvent(self, event) -> None:print("3. 鼠标被按下了,evt:", event)return super(MyBtn, self).mousePressEvent(event)app = MyApp(sys.argv)#修改为自己的类window = QWidget()btn = MyBtn(window)#修改为自己的类
    btn.setText("自定义按钮")
    btn.move(100, 100)def onPressed():print("按钮被点击了")btn.pressed.connect(onPressed)window.show()sys.exit(app.exec_())
    
  2. 演示图:

    在这里插入图片描述

四、总结

​ 根据我的理解,pyqt的事件机制主要分为下面过程:

	1. 事件进入消息队列,循环中处理每次循环收集到的事件;2. 事件传递:* 顶端的QApplication用notify接收事件,并区分控件类型,分发给正确的控件(receiver);* receiver接收到事件后由event方法进行二次分发,传递给正确的处理方法(如本例的mousePressEvent方法);* 若绑定了信号与槽,对应的处理方法继续传递,发送信号,调用对应的槽函数。

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

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

相关文章

如何通过内网穿透实现无公网IP也能远程访问内网的宝塔面板

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔,内网穿透三、使用固定公网地址访问宝塔 宝塔面板作为建站运维工具,适合新手,简单好用。当我们在家里/公司搭建了宝塔,没有公网IP,但是想要在外也可以访问内…

SVN修改已提交版本的日志方法

1.在工做中一直是使用svn进行項目的版本控制的,有时候因为提交匆忙,或是忘了添加Log,或是Log内容有错误。遇到此类状况,想要在查看项目的日志时添加log或是修改log内容,遇到以下错误: Repository has not b…

链表的应用

链表优点:链表各个节点个数可以灵活变动,学生多时可以增加节点,少时可以减少节点,链表不要求存储空间连续,空间利用率高 链表:链表中每个节点在内存中位置不一定连续,所以每一节点中一定有个字…

【EI会议征稿】第十届机电一体化与工业信息学国际学术研讨会(ISMII 2024)

第十届机电一体化与工业信息学国际学术研讨会(ISMII 2024) 2024 10th International Symposium on Mechatronics and Industrial Informatics 随着往年九届的成功举办,2024年第十届机电一体化与工业信息学国际学术研讨会(ISMII…

深入理解Flexbox:构建灵活的布局系统

由于篇幅限制,我将提供一个详细的文章大纲和部分内容。您可以根据这个大纲扩展文章内容,以满足3000字的要求。 深入理解Flexbox:构建灵活的布局系统 引言 在现代web设计中,创建灵活且响应式的布局是非常重要的。Flexbox&#xf…

Google DeepMind推出大模型 Gemini (vs GPT4):规模最大、能力最强的人工智能模型

系列文章目录 文章目录 系列文章目录前言谷歌和 Alphabet 首席执行官桑达尔-皮查伊(Sundar Pichai)的说明一、Gemini 介绍二 、最先进的性能三、新一代功能四、复杂的推理能力五、理解文本、图像、音频及其他内容六、先进的编码技术七、更可靠、可扩展、…

推荐一个可以记录历史进价的进销存软件?

“我是卖数码产品的,数码产品价格变动是比较大的,每次采购时候我都会多家对比价格,再决定在哪个厂家进货。所以基本上我每次进价价格都不一样,但是之前的询价情况又很难一一单独记录,让我采购的时候很被动。” “准备…

java--枚举

1.枚举 枚举是一种特殊类 2.枚举类的格式 注意: ①枚举类中的第一行,只能写一些合法的标识符(名称),多个名称用逗号隔开。 ②这些名称,本质是常量,每个常量都会记住枚举类的一个对象。 3.枚举类的特点 ①枚举类的…

预测:2024年的安防监控行业将迎来怎样的变化?

随着科技的飞速发展,安防监控视频技术已经成为我们生活中的重要部分。通过对其发展趋势的深入了解,我们可以对未来做出更为精确的预测。本文将探讨2024年安防监控视频技术的可能发展趋势。 1、5G技术的普及将加速安防视频监控技术的发展 5G的高速率、低…

背包问题学习

背包问题是常见的动态规划dp的问题 下面用到的符号: 常用n表示物品数, m表示背包容积f[i][j]表示i件物品, j的背包容量的最大价值w[i]表示第i件物品的价值, v[i] 表示第i件物品的容量f[0][0~m] 0, 所以n可以从1开始遍历一般是有两层嵌套循环 第一层遍历物品, 第二层遍历背包…

PHP使用HTTP代码示例模板

PHP是一种广泛用于服务器端的编程语言&#xff0c;它提供了许多内置的函数和扩展&#xff0c;以便开发人员能够轻松地处理HTTP请求和响应。在PHP中&#xff0c;您可以使用以下代码示例模板来处理HTTP请求和生成HTTP响应。 php复制代码 <?php // 处理GET请求 if ($…

获取Github Copilot的Token

可以在线提取出Github Copilot插件的Token&#xff0c;这样的话就可以把Token拿来做别的用处了&#xff0c;比如共享给其他人 Github Copilot是一款由GitHub和OpenAI合作开发的人工智能编程助手。它利用机器学习和自然语言处理技术&#xff0c;能够根据用户的输入自动生成代码…

IDEA中配置Git

Git 在IDEA中使用Git1 在IDEA中配置Git2 在IDEA中使用Git2.1在IDEA中创建工程并将工程添加至Git2.2 将文件添加到暂存区2.3 提交文件2.4 将代码推送到远程仓库2.5 从远程仓库克隆工程到本地2.6 从远程拉取代码2.7 版本对比2.8 创建分支2.9 切换分支2.10 分支合并 3 使用IDEA进行…

数据结构与算法编程题49

假设不带权有向图采用邻接表G存储&#xff0c;设计实现以下功能的算法。 &#xff08;1&#xff09;求出图中每个顶点的出度。 &#xff08;2&#xff09;求出图中出度为0的顶点数。 &#xff08;3&#xff09;求出图中每个顶点的入度。 #include <iostream> using names…

私域最全养号攻略---微信

微信号的使用规则&#xff1a; 注册新微信、微信实名认证、主动添加好友、面对面建群、被动添加好友、进群限制、朋友圈限制、好友上限 微信权重加分规则&#xff1a; 基础信息是否完整、注册时间、微信使用行为、 微信权重扣分规则&#xff1a; 使用的环境是否正常、部分行为会…

Michael.W基于Foundry精读Openzeppelin第40期——ERC20Burnable.sol

Michael.W基于Foundry精读Openzeppelin第40期——ERC20Burnable.sol 0. 版本0.1 ERC20Burnable.sol 1. 目标合约2. 代码精读2.1 burn(uint256 amount)2.2 burnFrom(address account, uint256 amount) 0. 版本 [openzeppelin]&#xff1a;v4.8.3&#xff0c;[forge-std]&#x…

1.pipenv创建pyqt5虚拟环境

pipenv创建pyqt5虚拟环境 一、安装pipenv ​ cmd输入指令&#xff1a; pip install pipenv二、安装虚拟环境 cmd进入我要创建环境的目录下 我使用以下命令在当前目录下创建虚拟环境&#xff1a; pipenv --python 3.8创建一个基于Python 3.8的虚拟环境&#xff0c;并生成一个…

华为鸿蒙开发——开发及引用静态共享包(HAR)、应用配置文件

文章目录 简述一、创建HAR模块二、编译HAR模块三、应用配置文件&#xff08;Stage模型&#xff09;四、应用配置文件&#xff08;FA模型&#xff09;1、配置文件的内部结构&#xff08;1&#xff09;app&#xff08;2&#xff09;deviceConfig&#xff08;3&#xff09;module …

C - 语言->内存函数

目录 系列文章目录 前言 1. memcpy使⽤和模拟实现 1.2 memcpy函数的模拟实现: 2. memmove 使⽤和模拟实现 2.1memmove的模拟实现&#xff1a; 3. memset 函数的使⽤ 4. memcmp 函数的使⽤ 系列文章目录 ✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff…

uniapp实战 —— 猜你喜欢(含滚动触底分页加载)

效果预览 组件封装 src\components\SUI_Guess.vue <script setup lang"ts"> import { ref, onMounted } from vue import type { GuessItem } from /types/index import { getGuessListAPI } from /apis/index import type { PageParams } from /types/global…