Qt的定时器(笔记)

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() 槽来刷新时钟的显示。

你可能感兴趣的:(Qt,C++,qt,开发语言,c++)