1、singleShot
原型:void QTimer::singleShot(int msec, const QObject *receiver, const char *member)
解釋:這個靜態函數在一個給定時間間隔 msec(毫秒) 之后調用一個槽。
用法1 :
假設類A有個槽函數 function() { }
我們要在1s之后執行它
QTimer::singleShot(1000,this, &A::function());
用法2:
實現循環
槽函數中還是singleShot 即:
//這樣的話就是一個每1秒執行一次的定時器
bool condition = true; function(){ if(condition){ //條件控制
QTimer::singleShot(1000,this, &A::function()); } }
2、timerEvent
函數原型:[virtual protected] void QObject::timerEvent(QTimerEvent *event)
解釋:QObject提供的定時器通過startTimer(int interval)啟動,該函數啟動了一個時間間隔為interval毫秒的定時器,啟動成功只返回一個定時器標志符,失敗返回0,因為只返回一個標志符,所以無法獲得該定時器的對象,它是QObject的成員函數,及不能正常的使用信號與槽,只能通過重載定時器事件處理函數timerEvent,在里面寫定時器觸發要做的事。
如果有多個定時器,可以通過QTimerEvent::timerId()來獲取已經啟動的定時器標識符。
該定時器只能通過killTimer(int id)殺死,參數id為之前生成定時器標志符,根據標志符殺死定時器。
void QObject::killTimer(int id);
每一個定時器做的事情可能不一樣,但是定時器處理函數只有一個,我們可以通過if判斷來讓某個定時器干某件事
class MyObject : public QObject { Q_OBJECT public: MyObject(QObject *parent = 0); protected: //重寫定時器事件
void timerEvent(QTimerEvent *event); private: //聲明定時器ID
int timeID; }; MyObject::MyObject(QObject *parent) : QObject(parent) { timeID = startTimer(1000); // 1-second timer
} void MyObject::timerEvent(QTimerEvent *event) { qDebug() << "Timer ID:" << event->timerId(); if(event->timerId() == timeID) { //todo function
if(timeID) { killTimer(timeID);// 殺死定時器
} timeID = 0; } }
3、QTimer類定時器
使用QTimer類定時器的步驟:
(1)先創建一個QTimer定時器實例:QTimer *timer = new QTimer(this);
(2)然后連接超時信號與槽:connect(timer, SIGNAL(timeout()), this, SLOT(Func()));
(3)設置定時器觸發間隔(設置觸發間隔有兩個方法,一個是調用setInterval(int msec)設置,另一個是調用start(int msec)時可將間隔時間作為參數):
void setInterval(int msec) ;,
(4)在需要的地方啟動定時器:start(),或者設間隔時間,可通過start(1000),即啟動一個1000毫秒的定時器
(5)用完了暫停定時器:stop();
(6)刪除定時器實例:delete timer;
參考鏈接:https://blog.csdn.net/ddllrrbb/article/details/88810767
https://blog.csdn.net/kidults/article/details/80091788