QObject 是所有 Qt 对象的基类,在 Qt 中提供了基本的定时器支持。使用 QObject::startTimer(),您可以启动一个以毫秒为单位的定时器作为参数。该函数返回一个唯一的整数定时器 ID。定时器现在将定期触发,直到您使用定时器 ID 显式调用 QObject::killTimer()。
要使这种机制起作用,应用程序必须在事件循环中运行。你用 QApplication::exec() 开始一个事件循环。当定时器触发时,应用程序发送一个 QTimerEvent,并且控制流离开事件循环,直到定时器事件被处理。这意味着当您的应用程序忙于做其他事情时,定时器无法触发。
在多线程应用程序中,您可以在任何具有事件循环的线程中使用定时器机制。要从非 GUI 线程启动事件循环,请使用 QThread::exec()。 Qt 使用对象的thread affinity来确定哪个线程将传递 QTimerEvent。无法为另一个线程中的对象启动定时器。
定时器功能的主要 API 是 QTimer。该类提供了在定时器触发时发出信号的常规定时器,并继承了 QObject 以便它很好地适应大多数 Qt 程序的所有权结构。正常的使用方式是这样的:
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &Foo::updateCaption);
timer->start(1000);
QTimer 对象成为该对象的子对象,因此,当该对象被删除时,定时器也被删除。接下来,它的 timeout() 信号连接到将完成工作的插槽,它以 1000 毫秒的值启动,表示它将每秒超时。
QTimer 还为单次定时器提供了一个静态函数。例如:
QTimer::singleShot(200, this, &Foo::updateCaption);
在这行代码执行 200 毫秒后,将调用 updateCaption() 槽。
要使 QTimer 工作,您的应用程序中必须有一个事件循环;也就是说,您必须在某处调用 QCoreApplication::exec() 。只有在事件循环运行时才会传递定时器事件。
模拟时钟示例展示了如何使用 QTimer 定期重绘QWidget。
AnalogClock::AnalogClock(QWidget *parent)
: QWidget(parent)
{
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update));
timer->start(1000);
...
}
每一秒,QTimer 都会调用 QWidget::update() 槽来刷新时钟的显示。