Qt事件處理(五)——定時器
目錄
前言
因為需要在開發板上無法直接使用OpenCV
的攝像頭獲取事件來獲取視訊幀進行處理,而前面已經移植好了v4l2
驅動攝像頭,這時候需要對影象進行進一步的處理,需要用到定時器來獲取視訊幀。使用定時器可以使用QTimer
的方法,也可以使用timerEvent
來做處理。
定時器
QTimer
QTimer timer = new QTimer();
connect(timer, SIGNAL(timeout()), this, SLOT(changeValue()));
// changeValue is slot function
timer->start(1000);
// another way
timer->setInterval(1000);
timer->start();
timerEvent
參考Qt中兩種定時器用法。QObject
是所有Qt
物件的基類,它提供了一個基本的定時器。通過QObject::startTimer()
,可以把一個1ms
為單位的時間間隔作為引數來開始定時器,這個函式返回一個唯一的整數定時器的識別符號。這個定時器開始就會在每一個時間間隔”觸發”,直到明確的使用這個定時器的識別符號來呼叫QObject::killTimer()
結束。
int QObject::startTimer(int interval);
開始一個定時器並返回定時器ID,如果不能開始一個定時器,將返回0。定時器開始後,每隔interval毫秒間隔將觸發一次超時事件,直到killTimer()被呼叫來刪除定時器。如果interval為0,那麼定時器事件每次發生時沒有視窗系統事件處理。virtual voidQObject::timerEvent(QTimerEvent *event);
虛擬函式timerEvent()被重寫來實現使用者的超時事件處理函式。如果有多個定時器在執行,QTimerEvent::timerId()
被用來查詢指定定時器,對其進行操作。當定時器事件發生時,虛擬函式timerEvent()隨著QTimerEvent事件引數類一起被呼叫,過載這個函式可以獲得定時器事件。
void Widget::timerEvent(QTimerEvent *event)
{
if(event->timerId() == myTimerId)
{
count++ ;
update();
}
else if(event->timerId() == myTimerId2)
{
count--;
update();
}
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawText(100, 150, QString::number(count));
}
void Widget::beginTimer()
{
// myTimerId = startTimer(500);
myTimerId2 = startTimer(1000);
// QMessageBox::information(this, tr("Test"), tr("begin Timer"));
}
void Widget::endTimer()
{
// killTimer(myTimerId);
killTimer(myTimerId2);
// QMessageBox::information(this, tr("Test"), tr("end Timer"));
}
在上述程式碼中,beginTimer()
函式是一個按鈕的槽函式,當按鈕被點選,就會觸發startTimer()
,我們可以在beginTimer()
中設定多個timerId
,然後特定事件超時之後,就會觸發timerEvent()
中的對應的timerId
,從而可以實現在不同的時間處理不同的事件。也就是如果有多個時間不同的定時器事件,我們可以定義多個startTimer()
產生特定的timeId
在不同時間對事件進行處理。
注意:定義了多個timeId
都必須用多個killTimer()
來進行釋放定時器。