Qt事件处理(五)——定时器

目录

  • 目录
  • 前言
  • 定时器
    • QTimer
    • timerEvent
  • 代码

前言

因为需要在开发板上无法直接使用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();

参考Qt之QTimer

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()来进行释放定时器。

代码

timeEvent_demo

你可能感兴趣的:(qt)