Qt-定时器QTimer
QTimer
1.设计一个每秒钟都触发的计时器
QTimer类为计时器提供了高级编程接口。要使用它,创建一个QTimer,将其timeout()信号连接到适当的插槽,并调用start()。从那时起,它将以恒定的间隔发出timeout()信号。
举例来说,一个1秒(1000毫秒)的计时器(从模拟时钟例子):
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
从那时起,每秒钟都会调用update()槽。
2.设计一个只触发一次的计时器
您可以通过调用setSingleShot(true)来设置计时器超时一次。你也可以使用静态QTimer::singleShot()函数在指定的时间间隔后调用一个槽:
QTimer::singleShot(200, this, SLOT(updateCaption()));
3.跨线程使用计时器
在多线程应用程序中,可以在任何具有事件循环的线程中使用QTimer。要从非gui线程启动事件循环,请使用QThread::exec()。Qt使用计时器的线程关联来确定哪个线程将发出timeout()信号。因此,您必须在其线程中启动和停止计时器;不可能从另一个线程启动计时器。
作为一种特殊情况,超时为0的QTimer将在窗口系统的事件队列中处理完所有事件后立即超时。这可以用来做繁重的工作,同时提供一个时髦的用户界面:
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(processOneThing()));
timer->start();
processOneThing()将被反复调用。它应该以这样一种方式编写,总是快速返回(通常在处理一个数据项之后),以便Qt能够向用户界面交付事件,并在完成所有工作后立即停止计时器。这是在GUI应用程序中实现繁重工作的传统方法,但是随着多线程在越来越多的平台上可用,毫秒的QTimer对象将逐渐被QThreads所取代。
注:
定时器的准确性取决于底层操作系统和硬件。大多数平台支持1毫秒的分辨率,尽管计时器的精度在许多实际情况下不等于这个分辨率。准确性还取决于计时器类型。对于Qt::PreciseTimer, QTimer将尝试保持精确度在1毫秒。精确的计时器也不会比预期的时间提前。对于Qt::CoarseTimer和Qt::VeryCoarseTimer类型,QTimer可能会比预期更早唤醒,这些类型的唤醒时间间隔在Qt::CoarseTimer的:5%和Qt::VeryCoarseTimer的500ms之间。如果系统繁忙或无法提供所要求的准确性,所有计时器类型都可能超时,比预期的时间要晚。在这种超时超时的情况下,即使多个超时已经过期,Qt也只会发出一次activated(),然后恢复原来的间隔。