Pyside2之QTimer

QTimer

QTimer类提供了重复和单次的定时器,要使用定时器,需要先创建一个QTimer实例,将其Timeout信号连接到槽函数,并调用start(),然后,定时器,会以恒定的间隔发出timeout信号
当窗口的控件收到Timeout信号后,他就会停止这个定时器。QTimer常常用于更新QLabel图像等。

start(milliseconds) 启动或重新启动定时器,时间间隔为毫秒,如果定时器已经运行,他将停止并重新启动,如果singleSlot信号为真,定时器仅被激活一次
Stop() 停止定时器

singleShot 在给定的时间间隔后调用一个槽函数时发射此信号
timeout 当定时器超时时发射此信号

import sys
from PyQt5.QtWidgets import QWidget,QPushButton,QApplication,QListWidget,QGridLayout,QLabel
from PyQt5.QtCore import QTimer,QDateTime

def showTime(self):
	#获取系统当前时间
	time=QDateTime.currentDateTime()
	#设置系统时间的显示格式
	timeDisplay=time.toString('yyyy-MM-dd hh:mm:ss dddd')
	#在标签上显示时间
	self.lable.setText(timeDisplay)
self.timer=QTimer(self)
self.timer.timeout.connect(self.showTime)	# 这里调用不能有函数括号,不是单纯的运行函数

#设置时间间隔并启动定时器
self.timer.start(1000)
#设置开始按钮不可点击,结束按钮可点击
self.startBtn.setEnabled(False)
self.endBtn.setEnabled(True)

#设置10秒后自动退出
QTimer.singleShot(10000,app.quit)
通过isActive()方法来判断定时器是否被激活
label.setWindowFlags(Qt.SplashScreen|Qt.FramelessWindowHint)	#设置无边框窗口

信号与槽

reference

使用signal实现videoTimer

from PySide2.QtCore import QThread, QObject, QMutex, QMutexLocker, Signal
import time
class Communicate(QObject):
    signal = Signal(str)
    
class VideoTimer(QThread):
    def __init__(self, frequent=20):
        QThread.__init__(self)
        self.stopped = False
        self.frequent = frequent
        self.time_signal = Communicate()
        self.mutex = QMutex()
        
    def run(self):
        with QMutexLocker(self.mutex):
            self.stopped = False
        while True:
            if self.stopped:
                return
            self.time_signal.signal.emit('1')
            time.sleep(1 / self.frequent)
            
    def stop(self):
        with QMutexLocker(self.mutex):
            self.stopped = True
            
    def is_stopped(self):
        with QMutexLocker(self.mutex):
            return self.stopped

PyQt5实现reference

'''
对于一个大类的对象,可以自定义实现一种信号
自定义信号的方式
pyqtSignal()信号对象
'''
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
#定义一个信号类
class MyTypesignal(QObject):
    #定义一个信号, 			可通过重载的方式定义多个信号
    senmsg=pyqtSignal(object)
    #编写一个信号相关触发的触发函数
    def run(self):
        self.senmsg.emit("hello PyQT5")  #通过run方法来发出message信息hello PyQt5,可发送多参数的信号
#定义一个槽函数类
class MySlot(QObject):
    def get(self,msg):
        print("信息:"+msg)

if __name__ == "__main__":
    send=MyTypesignal()
    slot=MySlot()
    #将信号与槽函数连接
    send.senmsg.connect(slot.get)
    send.run()
    #将信号与槽函数断开
    send.senmsg.disconnect(slot.get)
    send.run()
PyQt5实现信号与槽自动连接的方法详解如下:
1、定义控件的名称,设置控件与信号连接的原则,以名称自动连接
self.button.setObjectName("objectname")
QtCore.QMetaObject.connectSlotsByName(self)
2、槽函数格式为:
@QtCore.pyqtSlot()
def on_objectname_signalname(self):
3、参数说明
(1)objectname必须和关联控件名称一致
(2)signalname必须和控件所需要关联的信号名称一致

lambda表达式为槽函数传递参数

'''
python中的lambda表达式:没有名字的函数:即匿名函数
'''
#不带参数的函数定义
fun=lambda :print("hello world")
fun()
#带参数函数的定义
f=lambda x,y:x*y**2
print(f(3,4))

from PyQt5.QtWidgets import *
import sys
class lambdaslot(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("使用lambda表达式为槽函数传递参数")

        self.b1=QPushButton("按钮1")
        self.b2=QPushButton("按钮2")

        #相当于click点击信号+lamda表达式便可以实现点击传入槽函数参数
        self.b1.clicked.connect(lambda: self.onbutton(10, 20))
        self.b2.clicked.connect(lambda: self.onbutton(10, -20))
        self.b1.clicked.connect(lambda :QMessageBox.information(self,"结果","单击了button1"))

        lay=QHBoxLayout()
        lay.addWidget(self.b1)
        lay.addWidget(self.b2)

        m=QWidget()
        m.setLayout(lay)
        self.setCentralWidget(m)
    #槽函数需要参数,而button点击不能传入参数,可以使用lambda表达式传入参数
    def onbutton(self,m,n):
        print("m+n=",m+n)
        QMessageBox.information(self,"结果",str(m+n))

partial对象为槽函数传递参数

'''
python中的lpartial对象
partial(f,参数1,参数2,...)
'''
from PyQt5.QtWidgets import *
import sys
from functools import partial
class partialslot(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("使用partial对象为槽函数传递参数")
        self.b1=QPushButton("按钮1")
        self.b2=QPushButton("按钮2")
        #相当于click点击信号+lamda表达式便可以实现点击传入槽函数参数
        self.b1.clicked.connect(partial(self.onbutton,10,20))
        self.b2.clicked.connect(partial(self.onbutton,20,-40))
        lay=QHBoxLayout()
        lay.addWidget(self.b1)
        lay.addWidget(self.b2)
        m=QWidget()
        m.setLayout(lay)
        self.setCentralWidget(m)
    #槽函数需要参数,而button点击不能传入参数,可以使用partial对象传入参数
    def onbutton(self,m,n):
        print("m+n=",m+n)
        QMessageBox.information(self,"结果",str(m+n))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    p =partialslot()
    p.show()
    sys.exit(app.exec_())
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值