周期性的执行某个任务时,就需要使用计时功能。QBasicTimer跟QTimer都能实现计时功能。
QTimer可以绑定槽函数,间隔指定的时间发送一次信号,可以设置多个。
QBasicTimer使用时,需要重新timerEvent函数,QBasicTimer实例启动时需要传递两个参数,一个是触发间隔时间,另外一个触发的对象,一个程序中,出现多个QBasicTimer实例实例时,需要通过timerId()过滤发送对象。
t = QBasicTimer()t.start(1000, self)# start(self, int, QObject)
下面的实例演示的两种定时器的使用
import sys, random
from PyQt5.QtWidgets import QMainWindow, QFrame, QDesktopWidget, QApplication, QLabel, QHBoxLayout
from PyQt5.QtCore import Qt, QBasicTimer, pyqtSignal, QTimer
from PyQt5.QtGui import QPainter, QColor, QFont
class MinWin(QMainWindow):
def __init__(self):
super(MinWin, self).__init__()
w = QFrame()
self.label = QLabel()
self.label.setAlignment(Qt.AlignCenter)
font = QFont('SimHei', 13)
self.label.setFont(font)
self.blabel = QLabel()
self.blabel.setAlignment(Qt.AlignCenter)
font = QFont('SimHei', 13)
self.blabel.setFont(font)
hLayout = QHBoxLayout()
hLayout.addWidget(self.label)
hLayout.addWidget(self.blabel)
w.setLayout(hLayout)
self.setCentralWidget(w)
self.resize(900, 760)
self.numCount = 0
self.setContext(self.numCount)
self.timer = QTimer()
self.timer.start(1000)
self.timer.timeout.connect(self.timerFunc)
self.bTimer = QBasicTimer()
# print(self.bTimer.timerId())
self.bTimer.start(1000, self)
self.bNumCount = 0
self.blabel.setText(str(self.bNumCount))
# 这里又实例化了一个QBasicTimer,他也会向timerEvent()发送事件
# 在timerEvent函数中,我们使用event.timerId() == self.bTimer.timerId()进行过滤
# 就可以达到为指定的计时器执行指定的动作
self.b2Timer = QBasicTimer()
# print(self.b2Timer.timerId())
self.b2Timer.start(1000, self)
self.b2NumCount = 0
def setContext(self, comments):
self.label.clear()
self.label.setText(str(comments))
def timerFunc(self):
self.numCount += 1
# self.setContext(self.numCount)
self.label.setText(str(self.numCount))
# QBasicTimer必须要重写该事件
def timerEvent(self, event):
if event.timerId() == self.bTimer.timerId():
# 重写该事件
self.bNumCount += 1
self.blabel.setText(str(self.bNumCount))
if event.timerId() == self.b2Timer.timerId():
print(f'{self.b2Timer}发送信号')
if __name__ == '__main__':
app = QApplication([])
tetris = MinWin()
tetris.show()
sys.exit(app.exec_())