QTimer作爲Qt中方便快捷的定時器,在日常使用中經常用到,但是我有時會犯一些毛病,比如一位自己已經很瞭解一個類,就不會去特地觀看這個類的官方文檔,很多時候想用一些高級特性,會摸不着頭腦,比如這次,我想要弄一個1秒鐘之後只觸發一次的定時器,我腦子裏想的是:
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, [=] {
timer->stop();
delete timer;
//do something...
});
timer->start(1000);
我想了一下,這樣寫不是很雞肋麼?爲什麼非要手動擼一個只運行一次的定時器對象出來,越想就越是覺得有點蠢蠢的,於是去網上找,最後發現,原來Qt早就設計好了:
翻譯:
QTimer類提供重複和單次定時器。
QTimer類爲定時器提供高級編程接口。 創建一個QTimer實例,將其timeout()信號連接到相應的槽,然後調用start(),之後,它將以固定間隔發出timeout()信號。
舉個例子,一個1秒(1000毫秒)觸發的定時器(來自模擬時鐘示例):
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
計時開始之後,槽函數update()將會每秒觸發一次。
你可以通過調用setSingleShot(true)將計時器設置爲僅觸發一次。 你還可以使用靜態函數QTimer::singleShot()在指定的時間間隔後調用槽函數:
QTimer::singleShot(200, this, SLOT(updateCaption()));
有了這個函數,我們可以將一開始的那個僅觸發一次的方法修改爲以下代碼:
QTimer::singleShot(1000, []{
//do something...
});
//或者
QTimer::singleShot(1000, this, []{
//do something...
});
//又或者
QTimer::singleShot(200, this, SLOT(doSomething()));
//再或者
QTimer::singleShot(200, this, &MainWindow::doSomething);
這樣有什麼需要在1秒後僅觸發一次的操作放在匿名函數裏面,或者自己新建一個槽函數,連接超時的信號就可以了。