實戰PyQt5: 099-使用定時器
技術標籤:編碼pythonpyqt5pyside2qtgui程式設計
在Qt中有兩種使用定時器的方法,一種方法是使用QObject類的定時器;另一種方法是使用QTimer類。
QObect類的定時器
通過呼叫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,它包含三個可用值:
- 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定時器。
測試QObject的定時器功能
在視窗中建立一個顯示當前時間的時鐘,點選'啟動'按鈕後,開始顯示時間,點選'停止'按鈕,終止時間更新。完整程式碼如下:
importsys,time fromPyQt5importQtCore,QtGui,QtWidgets fromPyQt5.QtCoreimportQt fromPyQt5.QtWidgetsimport(QApplication,QWidget,QPushButton,QLCDNumber,QVBoxLayout) classDemoObjectTimer(QWidget): def__init__(self,parent=None): super(DemoObjectTimer,self).__init__(parent) #設定視窗標題 self.setWindowTitle('實戰PyQt5:QObject定時器演示!') #設定視窗大小 self.resize(400,200) self.initUi() definitUi(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:2pxsolidblack;color:red;background:blue;") vLayout=QVBoxLayout(self) vLayout.addWidget(self.lcd) vLayout.addStretch() vLayout.addWidget(self.btnStart) self.setLayout(vLayout) defonButtonStartClicked(self): ifself.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) deftimerEvent(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:首先建立一個QTimer,連線timeout()訊號到適當的槽函式,並呼叫start(),然後在恆定的時間間隔會發射timeout()訊號。
注意:當QTimer的父物件被銷燬時,它也會被自動銷燬。
QTimer的常用方法有:
- 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): 指定定時器的型別,引數可參照QObject.startTimer()。
- timerType(): 返回setTimerType()的設定值。
可以通過設定setSingleShot(true)來讓定時器只執行一次。也可以使用靜態函式QTimer.singleShot()。如:
QTimer.singleShot(200, self.updateTimer);
QTimer發出的訊號:
- timeout():定時器超時後,這個訊號被髮射。這是一個私有的訊號。它可以在訊號連線使用,但不能由使用者發出。
測試QTimer
使用QTimer實現上面的測試例子,完整程式碼如下:
importsys,time
fromPyQt5importQtCore,QtGui,QtWidgets
fromPyQt5.QtCoreimportQt,QTimer
fromPyQt5.QtWidgetsimport(QApplication,QWidget,QPushButton,QLCDNumber,QVBoxLayout)
classDemoTimer(QWidget):
def__init__(self,parent=None):
super(DemoTimer,self).__init__(parent)
#設定視窗標題
self.setWindowTitle('實戰PyQt5:QTimer定時器演示')
#設定視窗大小
self.resize(400,200)
self.initUi()
definitUi(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:2pxsolidblack;color:red;background:blue;")
vLayout=QVBoxLayout(self)
vLayout.addWidget(self.lcd)
vLayout.addStretch()
vLayout.addWidget(self.btnStart)
self.setLayout(vLayout)
defonButtonStartClicked(self):
ifself.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)
defonTimeOut(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定時器
本文知識點
- 使用QObject類的定時器功能;
- QTimerEvent定時器事件;
- 使用QTimer定時器;
- QTimer.singleShot()單次定時器。