【python】PyQt5事件机制、定时器原理分析和实战演练
创始人
2024-12-27 08:36:00
0

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

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

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

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,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, **kwargs     def __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()         #定时器每执行一次,窗口长和高都加10         self.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 sys  from PyQt5.Qt import *   class win(QWidget): #创建一个类,为了集成控件     # 增加参数接收*args, **kwargs     def __init__(self, *args, **kwargs):         # 当我们继承某个类时,需要调用父类构造方法         super().__init__(*args, **kwargs)         self.setWindowTitle('定时器的使用')         self.resize(300,300)         self.num=0         self.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+1         print(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时,定时器停止
在这里插入图片描述

相关内容

热门资讯

三分钟了解!微扑克数据外挂辅助... 三分钟了解!微扑克数据外挂辅助器脚本,wepoke辅助技巧(有挂透明挂)-哔哩哔哩是一款可以让一直输...
8刹那秒懂!(朋友安徽麻将)外... 8刹那秒懂!(朋友安徽麻将)外挂透视辅助透视挂!(透视)详细教程(2020已更新)(哔哩哔哩)是一款...
第9了解!wepoKER外挂透... 自定义新版微扑克德州系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑克德州专用辅助器,不...
第九了解!德州wpk软件透明挂... 自定义新版德州wpk系统规律,只需要输入自己想要的开挂功能,一键便可以生成出德州wpk专用辅助器,不...
一瞬间秒懂!(微乐湖南麻将)外... 一瞬间秒懂!(微乐湖南麻将)外挂辅助器神器!(透视)详细教程(2022已更新)(哔哩哔哩)是一款可以...
第9了解!AAPoKer外挂透... 第9了解!AAPoKer外挂透明挂辅助器神器,wepoke智能ai(今日头条)-哔哩哔哩;1、这是跨...
探索.NET内存之海:垃圾回收... 简述在.NET的广阔天地中,内存管理如同航海中的罗盘,指引着程序的稳健运...
idea双击没有反应,打不开 问题描述 Error opening zip file or JAR manifest missin...
1分钟了解!(荣誉)外挂透视辅... 1分钟了解!(荣誉)外挂透视辅助脚本!(透视)详细教程(2020已更新)(哔哩哔哩)是一款可以让一直...
微信小程序-实现跳转链接并拼接... 第一种常用拼接方法:普通传值的拼接 //普通传值的拼接 checkRouteBin...