1. 程式人生 > >Qt事件處理(五)——定時器

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()來進行釋放定時器。

程式碼