目录
前言
因为需要在开发板上无法直接使用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()
来进行释放定时器。