Qt QTimer使用

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秒後僅觸發一次的操作放在匿名函數裏面,或者自己新建一個槽函數,連接超時的信號就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章