在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器;一种是使用QTimer类。
1.QObject类的定时器
通过QObject.startTimer(),可以把一个一毫秒为单位的时间间隔作为参数来开始定时器,这个函数返回一个唯一的整数定时器的标识符。这个定时器开始就会在每一个时间间隔"触发",直到明确的使用这个定时器的标识符来调用QObject.killTimer()结束。
当定时器触发时,应用程序会发送一个QTimerEvent()事件。在事件循环中,处理器按照事件队列的顺序来处理定时器事件。当处理器正忙于其它事件处理时,定时器就不能立即处理。
startTimer的格式为:
int QObject.startTimer (self, int interval[,Qt.TimerType timerType = Qt.CoarseTimer])
开始一个定时器并返回定时器ID,在中止定时器时要用到。如果不能开始一个定时器,将返回0。定时器开始后,每隔interval毫秒间隔将触发一次超时事件,直到killTimer()被调用来删除定时器。如果interval为0,那么定时器事件在没有窗口系统事件需要处理时都会发生。
Qt.TimerType可以有三个值:
Qt.PreciseTimer 0 精确定时器:尽可能保持毫秒准确
Qt.CoarseTimer 1 粗定时器:5%的误差间隔
Qt.VeryCoarseTimer 2 很粗的定时器:只能到秒级
timerEvent的格式为:
timerEvent(self,QTimerEvent qEvent)
通过QTimerEvent的timerId()可以取得定时器的ID。
killTimer的格式:
killTimer(self,int Id)
中止通过startTimer获得的Id定时器。
下面的代码为在窗口中创建一个显示当前系统时间的时钟,并有时钟启动和停止的按钮。
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtWidgets
import time
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.setWindowTitle("窗口中的时钟")
self.resize(200, 100)
self.timer_id = 0
self.label = QtWidgets.QLabel("")
self.label.setAlignment(QtCore.Qt.AlignHCenter)
self.button1 = QtWidgets.QPushButton("开始")
self.button2 = QtWidgets.QPushButton("停止")
self.button2.setEnabled(False)
vbox = QtWidgets.QVBoxLayout()
vbox.addWidget(self.label)
vbox.addWidget(self.button1)
vbox.addWidget(self.button2)
self.setLayout(vbox)
self.button1.clicked.connect(self.on_clicked_button1)
self.button2.clicked.connect(self.on_clicked_button2)
def on_clicked_button1(self):
self.timer_id = self.startTimer(1000, timerType = QtCore.Qt.VeryCoarseTimer)
self.button1.setEnabled(False)
self.button2.setEnabled(True)
def on_clicked_button2(self):
if self.timer_id:
self.killTimer(self.timer_id)
self.timer_id = 0
self.button1.setEnabled(True)
self.button2.setEnabled(False)
def timerEvent(self, event):
self.label.setText(time.strftime("%H:%M:%S"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
除了使用QObject的startTimer()外,还可以使用QtCore模块中的QTimer类。
QTimer的构造函数为:QTimer([parent=None])
setInterval(self,int msec) 定时器触发的时间间隔毫秒数。如果interval为0,那么定时器事件在没有窗口系统事件需要处理时都会发生。
startTimer(self.[int msec]) 起动定时器。
stop(self) 停止定时器
isActive(self) 如果定时器在运行,返回True,否则,返回False。
timerId(self) 如果定时器在运行,返回定时器的ID,否则,返回-1。
interval(self) 返回setInterval()的设定值。
setSingleShot(self,bool asingleShot) 如果为True,定时器只工作一次;否则,重复工作。
setTimerType(self,Qt.TimerType timerType) 指定定时器的类型,参数可参照startTimer()。
timerType() 返回setTimerType()的设定值。
下列是用QTimer实现前面例子功能的代码:
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtWidgets
import time
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.setWindowTitle("窗口中的时钟")
self.resize(200, 100)
self.label = QtWidgets.QLabel("")
self.label.setAlignment(QtCore.Qt.AlignHCenter)
self.button1 = QtWidgets.QPushButton("开始")
self.button2 = QtWidgets.QPushButton("结束")
self.button2.setEnabled(False)
vbox = QtWidgets.QVBoxLayout()
vbox.addWidget(self.label)
vbox.addWidget(self.button1)
vbox.addWidget(self.button2)
self.setLayout(vbox)
self.button1.clicked.connect(self.on_clicked_button1)
self.button2.clicked.connect(self.on_clicked_button2)
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.on_timeout);
def on_clicked_button1(self):
self.timer.start(1000) # 1 секунда
self.button1.setEnabled(False)
self.button2.setEnabled(True)
def on_clicked_button2(self):
self.timer.stop()
self.button1.setEnabled(True)
self.button2.setEnabled(False)
def on_timeout(self):
self.label.setText(time.strftime("%H:%M:%S"))
if __name__ == "__main__":
import sys