Qt定時器處理
Qt的定時器只能通過純代碼實(shí)現(xiàn),定時器顧名思義,主要作用是定時特定的時間。
Qt提供了定時器事件類QQTimerEvent
和定時器類QTimer
實(shí)現(xiàn)定時器操作。
定時器QTimer使用
Qt提供了更高層次的定時器編程接口**QTimer
**類,可以使用信號和槽,還可以設(shè)置定時一次。比較常用的方法有:
-
QTimer::setInterval(timeout)
:設(shè)置定時的時間,單位是ms; -
QTimer::start()
:啟動定時器; -
QTimer::timeout()
:時間到發(fā)出信號timeout()
; -
QTimer::singleShot()
:只運(yùn)行一次的定時器; -
QTimer::stop()
:停止定時器
QTimer
實(shí)現(xiàn)定時器功能大致步驟:
- 創(chuàng)建定時器對象,
QTimer *timer = new QTimer(this);
- 將定時器的超時信號與自定義的時間更新槽函數(shù)連接,也可以使用lambda表達(dá)式
connect(timer,&QTimer::timeout,this,&MyLCDNumber::timerUpdate);
- 設(shè)置溢出時間,
timer->setInterval(1000);
- 定時器開始定時,
timer->start();
- 需要停止定時器調(diào)用
timer->stop()
即可。 - 具體代碼可參考如下:
MyLCDNumber::MyLCDNumber(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyLCDNumber)
{
ui->setupUi(this);
QTimer *timer = new QTimer(this);
// 關(guān)聯(lián)定時器的超時信號都自定義槽函數(shù)中
connect(timer,&QTimer::timeout,this,&MyLCDNumber::timerUpdate);
timer->setInterval(1000);
timer->start();
}
void MyLCDNumber::timerUpdate()
{
QTime time = QTime::currentTime();
QString text = time.toString("hh:mm:ss");
if(time.second() %2 ==0 ) // second()獲取秒的值
{
text[5] = ' '; // 每隔1s將:顯示為空格
}
ui->lcdNumber->display(text);
}
基于Lambda函數(shù)的實(shí)現(xiàn)方式
基于Lambda函數(shù)的實(shí)現(xiàn)方式僅綁定信號槽時不同,如下:
connect(m_timer,&QTimer::timeout,this,[=]()
{
// 處理定時內(nèi)容
}
);
一次性定時器
實(shí)現(xiàn)如下,該種方式特定情況下非常適用,比如防止按鈕不小心重復(fù)點(diǎn)擊或雙擊時,可以在按鈕的點(diǎn)擊信號槽函數(shù)中使用
QTimer::singleSlot(1000,this,[=]{
// 定時器處理
});
防止按鈕重復(fù)點(diǎn)擊或雙擊:
ui->pushButton->setEnabled(false); // 使按鈕使能關(guān)閉
QTimer::singleSlot(500,this,[=]{
ui->pushButton->setEnabled(true); // 500ms后按鈕使能開啟
});
使用QObject內(nèi)部定時器事件類QTImerEvent,重寫定時器事件實(shí)現(xiàn)定時器功能
重寫定時器事件在需要多個定時器的時候,可以減少系統(tǒng)資源。QtimerEvent
類描述了一個定時器事件。
-
QObject
的子類可以使用startTimer()
可以開啟一個定時器,該函數(shù)參數(shù)單位是毫秒,表示設(shè)定的時間,函數(shù)返回值表示這個定時器。當(dāng)定時器到達(dá)指定的時間時會進(jìn)入timerEvent()
函數(shù)進(jìn)行需要的操作。 - 通過函數(shù)
timerId()
可以獲取startTimer()
返回的定時器。 - 如果想要停止定時器調(diào)用
killTimer()
即可。
實(shí)現(xiàn)步驟:
-
頭文件聲明,重寫定時器事件函數(shù)
timerEvent()
void timerEvent(QTImerEvent *event); // 重寫定時器事件函數(shù) int m_timerID; // 定時器ID
-
啟動定時器
startTimer()
并返回定時器IDm_timerID = startTimer(1000); // 啟動定時1s
-
處理定時器事件
void classname::timerEvent(QTimerEvent *event) { if(m_timerID == event->timerID()) // 判斷定時器ID { // 處理ID為m_timerID的定時器事件 } else if(m_timerID2 == event->timerID()) { // 處理另一個定時器的事件 } }
-
在需要時關(guān)閉定時器
killTimer()
killTimer(m_timerID);
總結(jié)使用QTImerEven實(shí)現(xiàn)定時器的操作的步驟:文章來源:http://www.zghlxwxcb.cn/news/detail-446948.html
- 使用
startTImer()
開啟一個定時器;- 重寫
timerEvent()
函數(shù);- 需要關(guān)閉定時器時調(diào)用
killTimer()
;
當(dāng)需要多個定時器時可以參考如下使用:文章來源地址http://www.zghlxwxcb.cn/news/detail-446948.html
QList<int> timerIDList;
// ...
for(int i=0;i<100;i++)
timerIDList.append(startTimer(1000));
// ...
void calssname::timerEvent(QTimerEvent *event)
{
if(timerIDList.at(0) == event->timerID())
{
// 處理當(dāng)前定時器
}
else if(timerIDList.at(0) == event->timerID())
{
// 處理當(dāng)前定時器
}
// ...
}
到了這里,關(guān)于【Qt】定時器處理——定時器事件類QTimerEvent和定時器類QTimer使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!