【python】PyQt5事件机制、定时器原理分析和实战演练

在这里插入图片描述
在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,云原生K8S,人工智能,js逆向,App逆向,网络系统安全,数据分析,PyQt5,tkinter,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:PyQt5桌面应用开发,零基础到进阶应用实战
景天的主页:景天科技苑

文章目录

  • PyQt5事件机制
    • PyQt5事件处理的API
    • PyQt5事件机制演练
  • PyQt5定时器
    • 定时器的操作方法有两种
      • (1)利用每个对象包含的timerEvent函数
      • (2)利用定时器模块QTimer

PyQt5事件机制

PyQt为事件处理提供了两种机制:高级的信号与槽机制,以及低级的事件处理机制。信号与槽可以说是对事件处理机制的高级封装。事件机制更偏向于底层。

常见事件类型:
键盘事件:按键按下和松开。
鼠标事件:鼠标指针移动,鼠标按下和松开。
拖放事件:用鼠标进行拖放。
滚轮事件:鼠标滚轮滚动。
绘屏事件:重绘屏幕的某些部分。
定时事件:定时器到时。
焦点事件:键盘焦点移动。
进入/离开事件:鼠标指针移入Widget内,或者移出。
移动事件:Widget的位置改变。
大小改变事件:Widget的大小改变。
显示/隐藏事件:Widget显示和隐藏。
窗口事件:窗口是否为当前窗口。
PyQt提供了如下5种事件处理和过滤方法(有弱到强):

重新实现事件函数,比如mousePressEvent(),keyPressEvent()等等。
重新实现QObject.event()。
安装时间过滤器。
在QApplication中安装事件过滤器。
重新实现QAppliction的notifiy()方法。

在这里插入图片描述

在这里插入图片描述

PyQt5事件处理的API

在这里插入图片描述

PyQt5事件机制演练

import sys
from PyQt5.Qt import *#通过继承,重新notify方法
#事件会分发给对象里面的notify方法
class App(QApplication):#notify第一个参数是控件类型(事件接收者),第二个是事件类型def notify(self, recevier, evt):#notify会监控所有的事件,对事件进行分发。为了打印鼠标点击按钮产生的事件,我们进行了过滤#过滤事件接收者是按钮,事件类型是鼠标按钮按下#evt属于QEvent类型。QEvent类型里面有个type方法,用来判断事件类型if recevier.inherits("QPushButton") and evt.type() == QEvent.MouseButtonPress:print(recevier, evt)#优先调用子类notify方法,由于我们没有写具体功能,什么也做不了,会报错,为了防止程序报错,需要将父类的notify方法返回#这行代码就是负责分发的return super().notify(recevier, evt)#写个子类,过滤event事件类型
class Btn(QPushButton):#事件会分发给按钮对象的event方法,event里面包含很多事件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()
#设置主题
window.setWindowTitle("事件机制")
btn = Btn(window)
btn.setText("按钮")
btn.move(100, 100)def cao():print("按钮被点击了")#按键按下
btn.pressed.connect(cao)window.show()sys.exit(app.exec_())

运行

在这里插入图片描述

点击按钮
可见事件被触发
在这里插入图片描述

在这里插入图片描述

PyQt5定时器

在基于PyQt5的应用程序开发过程中经常会遇到一些需要循环执行的任务,即定时多长时间任务循环一次。
常用于数据库定时更新、界面刷新、内存清理、脚本任务运行、进度条等需要定时更新的程序段,小到某一参数的定时更新,大到整个线程任务的更新、程序段的循环定时执行。

本文将详细介绍如何在PyQt5中使用定时器,包括定时器的基本原理、创建和使用定时器的方法以及一些实际应用案例。

定时器的操作方法有两种

  • 方法一:利用每个对象包含的timerEvent函数

  • 方法二:利用定时器模块 需要 from PyQt5.QtCore import QTimer

(1)利用每个对象包含的timerEvent函数

API介绍已经案例演示
在这里插入图片描述

# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys#自定义一个类继承QObejct
# class MyObject(QObject):
#     def timerEvent(self, evt): #重写对象的定时器函数
#         print(evt, "1")#自定义个类继承QLabel,可以重写父类方法,尤其是timerEvent对象的定时器函数
class MyLabel(QLabel):#增加参数接收*args, **kwargsdef __init__(self, *args, **kwargs):# 当我们继承某个类时,需要调用父类构造方法#加载父类初始化方法super().__init__(*args, **kwargs)self.setText("10")self.move(235, 235)self.setStyleSheet("font-size: 28px;")#设置标签上展示的初始数字def setSec(self, sec):self.setText(str(sec))def startMyTimer(self, ms):#可以创建多个,每个startTimer返回的id不同#每个一定的时间,就会自动执行对象中的timerEvent函数#参数1 间隔时间,单位毫秒self.timer_id = self.startTimer(ms,timerType=Qt.PreciseTimer) #启动对象定时器函数def timerEvent(self, *args, **kwargs):print("倒计时进行中")# 1. 获取当前的标签的内容current_sec = int(self.text())current_sec -= 1#将内容以字符串形式展示,整形数据没法直接放进来self.setText(str(current_sec))#当前数字减为0时,停止定时器if current_sec == 0:print("倒计时停止")# 释放对象的定时器函数self.killTimer(self.timer_id)class MyWidget(QWidget):def startMyTimer(self, ms):#可以创建多个,每个startTimer返回的id不同#每个一定的时间,就会自动执行对象中的timerEvent函数#参数1 间隔时间,单位毫秒self.widget_id = self.startTimer(ms,timerType=Qt.PreciseTimer) #启动对象定时器函数def timerEvent(self, *args, **kwargs):#获取当前窗口的高和宽current_w = self.width()current_h = self.height()#定时器每执行一次,窗口长和高都加10self.resize(current_w + 10, current_h + 10)print("当前窗口高度", current_h)#设置当前窗口高度达到550时,停止定时器if current_h == 550:print("widget停止")# 释放对象的定时器函数self.killTimer(self.widget_id)if __name__ == '__main__':# 1. 创建一个应用程序对象app = QApplication(sys.argv)# 2. 控件的操作# 2.1 创建控件window = MyWidget()# 2.2 设置控件window.setWindowTitle("QObject定时器的使用")window.resize(500, 500)window.startMyTimer(1000)#创建第二个控件label = MyLabel(window)label.setSec(10)label.startMyTimer(500)# 2.3 展示控件window.show()# 3. 应用程序的执行, 进入到消息循环sys.exit(app.exec_())

运行
在这里插入图片描述

当到达临界值,定时器停止
在这里插入图片描述

(2)利用定时器模块QTimer

需要导包 from PyQt5.QtCore import QTimer
QTimer 的事件可以通过 QTimer.timeout.connect() 信号槽绑定到对应的处理函数上。
例如,在下面的示例中,定义了一个 onTimer() 函数,每当定时器时间到达时,就会执行这个函数。

要启动 QTimer 定时器,需要调用 QTimer.setInterval() 方法,并传入时间间隔,单位为毫秒(ms)。
例如,传入 1000 表示每隔 1000 毫秒(即 1 秒)会触发一次 operate()。需要注意的是,定时器不仅仅是触发一次,而是持续按照设定的时间间隔触发,直到调用 QTimer.stop() 方法停止。

import sysfrom PyQt5.Qt import *class win(QWidget): #创建一个类,为了集成控件# 增加参数接收*args, **kwargsdef __init__(self, *args, **kwargs):# 当我们继承某个类时,需要调用父类构造方法super().__init__(*args, **kwargs)self.setWindowTitle('定时器的使用')self.resize(300,300)self.num=0self.setup_ui()def setup_ui(self):#添加个标签,初始化标签self.lable = QLabel(self)self.lable.move(120,120)self.lable.setStyleSheet("font-size: 28px;")self.timer = QTimer(self)  # 初始化一个定时器# 设置计时间隔;单位毫秒self.timer.setInterval(1000)self.timer.timeout.connect(self.operate)  # 每次计时到时间时发出信号#启动定时器,也可以在这里设置时间间隔,例如:self.timer.start(1000) 表示每秒执行一次self.timer.start()#定时器要执行的动作def operate(self):self.num=self.num+1print(self.num)#动态设置标签显示数字self.lable.setText(str(self.num))#设置定时器停止阈值if self.num == 5:print("计时停止")self.timer.stop()if __name__=='__main__':app=QApplication(sys.argv)  #创建应用window=win()window.show()sys.exit(app.exec_())

运行
在这里插入图片描述

当num数值增加到5时,定时器停止
在这里插入图片描述

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

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

相关文章

2025秋招NLP算法面试真题(十四)-RoBERTa-Bert的改进

RoBERTa:更大更多更强 今天分享一个Bert的改进工作RoBERTa。RoBERTa是训练充分的Bert。 主要掌握以下几点,与Bert相比较,RoBERTa预训练的时候: 动态掩码:comparable or slightly better去掉NSP任务并且更改数据输入格式为全部填充可以跨越多个文档更多数据,更大bsz,更…

《浔川AI社 AI 产品上线公告》——浔川总社(浔川周报第一期 24.7.2pm)

《浔川 Python 社 AI 产品上线公告》 尊敬的用户: 您好! 我们非常高兴地向您宣布,浔川 AI 社经过不懈的努力和创新,现已成功上线 3 款令人瞩目的 AI 产品! 这 3 款 AI 产品分别是: 浔川AI翻译v3.0&#xff…

Qt时间日期处理与定时器使用总结

一、日期时间数据 1.QTime 用于存储和操作时间数据的类,其中包括小时(h)、分钟(m)、秒(s)、毫秒(ms)。函数定义如下: //注:秒(s)和毫秒(ms)有默认值0 QTime::QTime(int h, int m, int s 0, int ms 0) 若无须初始化时间数据,可…

redis 消息订阅命令

在 Redis 中,消息订阅和发布是一种用于实现消息传递的机制。主要命令包括 SUBSCRIBE、UNSUBSCRIBE、PUBLISH 和 PSUBSCRIBE 等。下面是如何使用这些命令的详细说明和示例。 1. SUBSCRIBE 命令 SUBSCRIBE 命令用于订阅一个或多个频道,以接收这些频道发布…

常见sql语句练习

Tips:之前查看网上的文章感觉太乱了,所以自己整理了一套sql语句来练习,主要也可以拿来应对面试,需要的可以自行下载练习 包含基本语句、聚合函数、模糊查询、范围查询、排序、聚合、分组、分页、子查询、索引和视图、左右连接、双…

无人值守过磅管理系统实现数据实时传递

依据为某公司信息化系统建设前提下,客商平台在线预约称重、车辆到场智能排队系统、空车入场取装车票装车、门岗智能管控系统、建设地磅无人值守、进出货场管理系统、手机APP远程派车、查询报表、查询实时过磅数据,集中式监控管理系统,配合无人…

分享快乐,分享5款我认为好用的软件

​ 分享是奉献的果实,分享是快乐的前提。每天给小伙伴们分享自己认可的软件,也是莫大的一种幸福,今天依然带来五款好用的软件。 1.文本编辑——Notepads ​ Notepads是一款简约高效的文本编辑器,专为Windows10及以上版本设计。它…

Debian linux安装最新版Cmake

直接sudo apt install camke不是最新版本 卸载cmake sudo apt autoremove cmake下载cmake cmake官网 最上面的是候选版本,往下滑是最新稳定版 解压(改成自己的包) tar -zxvf cmake-3.30.0-rc4.tar.gz进入解压后的文件夹 lscd cmake-3.3…

每天一个数据分析题(三百九十二)- 多元线性回归

多元线性回归的正规方程组中系数矩阵X’X的阶数等于?(p个变量,n个观测值) A. n B. p-1 C. p D. n-1 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Py…

等保测评——云计算扩展测评项

安全物理环境-基础设施位置 应保证云计算基础设置位于中国境内。 该控制点是针对云计算平台提出的安全要求,公有云服务商和自建私有云的企业或组织在规划设计时应同步考虑此安全要求。无论是自建数据中心还是租赁第三方基础设施,其数据机房及云计算相关…

java常用类(3)

目录 一. 正则表达式 二. Math类 三. Random类 四. Date类 五. Calendar类 六. SimpDateFormate类 七. BigInteger类 八. BigDecimal类 一. 正则表达式 正则表达式(Regular Expression)就是用一些特殊的符号去匹配一个字符串是否符合规则,利用String类中的matches()方…

提升效能:Symfony 性能优化实用指南

Symfony 是一个功能丰富的 PHP Web 框架,但在构建高性能应用程序时,开发者需要考虑多种性能优化策略。本文将探讨一系列实用的 Symfony 性能优化技巧,帮助开发者提高应用程序的响应速度和整体性能。 1. 了解 Symfony 缓存机制 Symfony 提供…

蒙阴蜜桃节:北纬 35 度的甜蜜盛宴

蒙阴,这座位于北纬 35 度黄金水果带的魅力之城,凭借着沙壤土、长日照、大温差、好生态的天然禀赋,孕育出了令人陶醉的“蒙阴蜜桃——北纬 35 度的甜”。 7月2日—3日,主题为“蒙阴好丰景 桃香产业兴”的国家鲁中山区桃产业集群项目…

3d打开模型的时候怎么没有灯光?---模大狮模型网

在3D建模与渲染过程中,灯光是至关重要的元素之一,直接影响到最终场景的视觉效果和真实感。然而,有时打开3D模型时可能会发现缺乏适当的灯光设置,这会导致场景显得暗淡或平淡无奇。本文将探讨为何在打开3D模型时可能没有灯光的原因…

QGC添加添加QML可访问的单例

文章目录 前言一、添加文件二、修改qgroundcontrol.pro三、修改QGCApplication.cc四、修改QGroundControlQmlGlobal.h五、修改QGroundControlQmlGlobal.cc六、测试前言 QGC 4.2 一、添加文件 在src目录下添加文件夹SingletonTest,在里面新建SingletonTest.cc和SingletonTes…

OCR text detect

主干网络 VoVNet:实时目标检测的新backbone网络_vovnet pytorch-CSDN博客 DenseNet: arxiv.org/pdf/1608.06993 密集连接: DenseNet 的核心思想是将网络中的每一层与其前面的所有层直接连接。对于一个 L 层的网络,DenseNet 具有…

GIT将文件推送到远程仓库,即添加文件

摘自这里公开资料: git怎么让文件推送 • Worktile社区 要将文件推送到Git仓库,需要经过以下步骤: 1. 初始化Git仓库:在本地项目文件夹中打开命令行工具,并执行以下命令来初始化Git仓库: “shell git in…

Git学习(常用的一些命令)

🍎个人博客:个人主页 🏆个人专栏:日常聊聊 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 配置相关: 创建与克隆仓库: 基本操作: 分支操作: 远程仓库操作&#xff1a…

重保期间的网站安全防护:网站整站锁的应用与实践

标题:重保期间的网站安全防护:网站整站锁的应用与实践 一、引言 在重大活动或事件(通常被称为“重保”)期间,网站的安全问题尤为突出。由于此时网站的访问量和关注度可能达到高峰,因此也成为了黑客攻击的…

【AI原理解析】—k-means原理

目录 步骤 注意事项 优点 缺点 步骤 初始化: 选择 k 个初始质心(通常通过随机选择数据集中的 k 个点作为初始质心)。迭代过程: 分配数据点到最近的质心: 对于数据集中的每个数据点,计算它与 k 个质心之…