当前位置: 代码网 > it编程>前端脚本>Python > 【python】PyQt5事件机制、定时器原理分析和实战演练

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

2024年07月28日 Python 我要评论
信号与槽机制是对事件机制的高级封装。事件机制更偏向于底层。在基于PyQt5的应用程序开发过程中经常会遇到一些需要循环执行的任务,即定时多长时间任务循环一次。常用于数据库定时更新、界面刷新、内存清理、脚本任务运行、进度条等需要定时更新的程序段,小到某一参数的定时更新,大到整个线程任务的更新、程序段的循环定时执行。本文将详细介绍如何在PyQt5中使用定时器,包括定时器的基本原理、创建和使用定时器的方法以及一些实际应用案例。

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

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

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

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时,定时器停止
在这里插入图片描述

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com