在Qt中有两种使用定时器的方法,一种方法是使用QObject类的定时器;另一种方法是使用QTimer类。
通过调用QObject.startTimer(),可以启动一个参数以毫秒为时间单位间隔的定时器,这个函数返回一个唯一的整数定时器的标识符。该定时器开始就会在每一个时间间隔"触发",直到明确的使用这个定时器的标识符来调用QObject.killTimer()来结束它。当定时器触发时,应用程序会发送一个QTimerEvent()事件。在Qt事件循环中,处理器按照事件队列的顺序来处理定时器事件。如果处理器正忙于其它事件处理时,定时器就不能被立即处理。
startTimer的格式为:
int QObject.startTimer (self, int interval[,Qt.TimerType timerType = Qt.CoarseTimer])
它启动一个定时器并返回该定时器的ID, 如果未能成功启动定时器,将返回0。定时器启动后,直到调用killTimer()删除该定时器前,每隔interval毫秒时间间隔将触发一次超时事件。如果interval为0,那么定时器事件在没有窗口系统事件需要处理时都会触发。参数timerType的类型为枚举类型Qt.TimerType,它包含三个可用值:
timerEvent的格式为:
timerEvent(self,QTimerEvent qEvent)
通过QTimerEvent的timerId()可以取得定时器的ID。
killTimer的格式为:
killTimer(self,int id)
中止通过startTimer获得的id定时器。
在窗口中创建一个显示当前时间的时钟,点击'启动'按钮后,开始显示时间,点击'停止'按钮,终止时间更新。完整代码如下:
import sys,time
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QLCDNumber, QVBoxLayout)
class DemoObjectTimer(QWidget):
def __init__(self, parent=None):
super(DemoObjectTimer, self).__init__(parent)
# 设置窗口标题
self.setWindowTitle('实战PyQt5: QObject定时器 演示!')
# 设置窗口大小
self.resize(400, 200)
self.initUi()
def initUi(self):
self.timer_id = 0
self.btnStart = QPushButton('启动')
self.btnStart.setMinimumHeight(48)
self.btnStart.clicked.connect(self.onButtonStartClicked)
self.start = False
self.lcd = QLCDNumber(self)
#设置液晶显示的最低高度
self.lcd.setMinimumHeight(100)
#设置数字位数
self.lcd.setDigitCount(8)
#设置数字显示模式, 十进制
self.lcd.setMode(QLCDNumber.Dec)
#设置数字屏显示样式
self.lcd.setSegmentStyle(QLCDNumber.Flat)
#设置外观样式
self.lcd.setStyleSheet("border: 2px solid black; color: red; background: blue;")
vLayout = QVBoxLayout(self)
vLayout.addWidget(self.lcd)
vLayout.addStretch()
vLayout.addWidget(self.btnStart)
self.setLayout(vLayout)
def onButtonStartClicked(self):
if self.start:
self.start = False
self.btnStart.setText('启动')
if(self.timer_id):
self.killTimer(self.timer_id)
self.timer_id = 0
self.lcd.display('0')
else:
self.start = True
self.btnStart.setText('停止')
self.timer_id = self.startTimer(1000, Qt.VeryCoarseTimer)
def timerEvent(self, event):
self.lcd.display(time.strftime('%H:%M:%S'))
if __name__ == '__main__':
app = QApplication(sys.argv)
window = DemoObjectTimer()
window.show()
sys.exit(app.exec())
运行效果如下图:
测试QObject类的定时器
QTimer类提供了重复和单次触发信号的定时器。QTimer类为定时器提供了一个高级别的编程接口。 很容易使用QTimer:首先创建一个QTimer,连接timeout()信号到适当的槽函数,并调用start(),然后在恒定的时间间隔会发射timeout()信号。
注意:当QTimer的父对象被销毁时,它也会被自动销毁。
QTimer的常用方法有:
可以通过设置setSingleShot(true)来让定时器只执行一次。也可以使用静态函数QTimer.singleShot()。如:
QTimer.singleShot(200, self.updateTimer);
QTimer发出的信号:
使用QTimer实现上面的测试例子,完整代码如下:
import sys,time
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QLCDNumber, QVBoxLayout)
class DemoTimer(QWidget):
def __init__(self, parent=None):
super(DemoTimer, self).__init__(parent)
# 设置窗口标题
self.setWindowTitle('实战PyQt5: QTimer定时器 演示')
# 设置窗口大小
self.resize(400, 200)
self.initUi()
def initUi(self):
self.timer = QTimer(self)
self.timer.timeout.connect(self.onTimeOut)
self.btnStart = QPushButton('启动')
self.btnStart.setMinimumHeight(48)
self.btnStart.clicked.connect(self.onButtonStartClicked)
self.start = False
self.lcd = QLCDNumber(self)
#设置液晶显示的最低高度
self.lcd.setMinimumHeight(100)
#设置数字位数
self.lcd.setDigitCount(8)
#设置数字显示模式, 十进制
self.lcd.setMode(QLCDNumber.Dec)
#设置数字屏显示样式
self.lcd.setSegmentStyle(QLCDNumber.Flat)
#设置外观样式
self.lcd.setStyleSheet("border: 2px solid black; color: red; background: blue;")
vLayout = QVBoxLayout(self)
vLayout.addWidget(self.lcd)
vLayout.addStretch()
vLayout.addWidget(self.btnStart)
self.setLayout(vLayout)
def onButtonStartClicked(self):
if self.start:
self.start = False
self.btnStart.setText('启动')
self.timer.stop()
self.lcd.display('0')
else:
self.start = True
self.btnStart.setText('停止')
self.timer.start(1000)
def onTimeOut(self):
self.lcd.display(time.strftime('%H:%M:%S'))
if __name__ == '__main__':
app = QApplication(sys.argv)
window = DemoTimer()
window.show()
sys.exit(app.exec())
运行结果如下图:
测试QTimer定时器
喜欢本文内容就关注, 收藏,点赞,评论和转发。
联系客服