QTimer 类

QTimer 类提供重复和单次定时器。 更多信息...

头文件 #include <QTimer>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core
继承 QObject

属性

公共函数

QTimer(QObject *parent = nullptr)
虚拟~QTimer()
QBindable<bool>bindableActive()
QBindable<int>bindableInterval()
QBindable<bool>bindableSingleShot()
QBindable<Qt::TimerType>bindableTimerType()
QMetaObject::ConnectioncallOnTimeout(Functor &&slot)
QMetaObject::ConnectioncallOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)
intinterval() const
std::chrono::millisecondsintervalAsDuration() const
boolisActive() const
boolisSingleShot() const
intremainingTime() const
std::chrono::millisecondsremainingTimeAsDuration() const
voidsetInterval(int msec)
voidsetInterval(std::chrono::milliseconds value)
voidsetSingleShot(bool singleShot)
voidsetTimerType(Qt::TimerType atype)
voidstart(std::chrono::milliseconds msec)
inttimerId() const
Qt::TimerTypetimerType() const

公共槽

voidstart(int msec)
voidstart()
voidstop()

信号

voidtimeout()

静态公共成员

voidsingleShot(int msec, const QObject *receiver, const char *member)
voidsingleShot(int msec, Qt::TimerType timerType, const QObject *receiver, const char *member)
voidsingleShot(Duration msec, const QObject *context, Functor &&functor)
voidsingleShot(Duration msec, Qt::TimerType timerType, const QObject *context, Functor &&functor)
voidsingleShot(Duration msec, Functor &&functor)
voidsingleShot(Duration msec, Qt::TimerType timerType, Functor &&functor)
voidsingleShot(std::chrono::milliseconds msec, const QObject *receiver, const char *member)
voidsingleShot(std::chrono::milliseconds msec, Qt::TimerType timerType, const QObject *receiver, const char *member)

重写受保护的函数

virtual voidtimerEvent(QTimerEvent *e) override

详细信息

QTimer类提供了定时器的高层编程接口。要使用它,创建一个QTimer,将其timeout()信号连接到适当的槽,并调用start()。从那时起,它将以恒定的间隔发出timeout()信号。

一秒(1000毫秒)定时器的示例(来自Analog Clock示例)

    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update));
    timer->start(1000);

从那时起,每秒都会调用update()槽。

您可以通过调用setSingleShot(true)将定时器设置为一秒一次超时。您还可以使用静态函数QTimer::singleShot()在指定的时间间隔后调用槽

    QTimer::singleShot(200, this, &Foo::updateCaption);

在多线程应用程序中,您可以在任何具有事件循环的线程中使用QTimer。要从非GUI线程启动事件循环,请使用QThread::exec()。Qt使用定时器的线程亲和力来确定哪个线程将发出timeout()信号。因此,您必须在定时器的线程中开始和停止它;从一个线程开始定时器是不可能的。

作为一种特殊情况,超时为0的QTimer将尽可能快地超时,尽管零定时器和其他事件源之间的顺序是未指定的。零定时器可用于在用户界面保持响应性的同时执行一些工作

    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &Foo::processOneThing);
    timer->start();

从那时起,processOneThing()将被反复调用。它应该这样编写,以便它可以快速返回(典型地,在处理一个数据项之后),以便Qt可以向用户界面交付事件并在它完成所有工作后立即停止定时器。这是在GUI应用程序实现繁重工作的传统方式,但随着多线程现在越来越多地应用于平台,我们预计零毫秒QTimer对象将逐渐被QThread所取代。

准确性和定时器分辨率

定时器的准确性取决于底层操作系统和硬件。大多数平台支持1毫秒的分辨率,但定时器的准确性通常不会等于这个分辨率。

准确性还取决于定时器类型。对于Qt::PreciseTimer,QTimer将尝试保持1毫秒的准确性。精确定时器也将永远不会提前超时。

对于Qt::CoarseTimerQt::VeryCoarseTimer类型,QTimer可能在预期时间之前唤醒,但这些类型的公差范围内:Qt::CoarseTimer为间隔的5%,Qt::VeryCoarseTimer为500毫秒。

如果系统繁忙或无法提供请求的准确性,所有定时器的超时时间可能会晚于预期。在这种情况下,如果超时超时,Qt将只发出一次timeout(),即使多个超时已经过期,然后将继续原始间隔。

QTimer的替代方案

使用QTimer的另一种方法是调用对象的QObject::startTimer(),并在你的类中重新实现QObject::timerEvent()事件处理函数(该类必须继承自QObject)。缺点是timerEvent()不支持单次射击定时器或信号等高级功能。

另一种替代方法是QBasicTimer。与直接使用QObject::startTimer()相比,它通常更简单。参见Timers了解这三种方法的概述。

某些操作系统限制可能使用的定时器数量;Qt会尝试解决这些限制。

另请参阅 QBasicTimerQTimerEventQObject::timerEvent(),TimersAnalog Clock

属性文档

[bindable read-only] active : bool

注意:此属性支持QProperty绑定。

如果定时器正在运行,则此布尔型属性为true;否则为false。

[bindable] interval : int

注意:此属性支持QProperty绑定。

此属性包含以毫秒为单位的超时间隔。

此属性的默认值为0。一个超时间隔为0的QTimer将一处理完窗口系统事件队列中的所有事件就超时。

设置激活定时器的间隔将更改其timerId()。

另请参阅:singleShot

[read-only] remainingTime : const int

此属性包含以毫秒为单位的时间。

返回定时器剩余的毫秒数,直到超时。如果定时器未激活,则返回值将-1。如果定时器已逾期,则返回0。

访问函数

intremainingTime() const

另请参阅:interval

[bindable] singleShot : bool

注意:此属性支持QProperty绑定。

此属性包含定时器是否为单次定时器。

单次定时器只触发一次,非单次定时器每interval毫秒触发一次。

此属性的默认值为false

另请参阅:intervalsingleShot

[bindable] timerType : Qt::TimerType

注意:此属性支持QProperty绑定。

控制定时器的准确性。

此属性的默认值为Qt::CoarseTimer

另请参阅 Qt::TimerType.

成员函数文档

[static] template <typename Duration, typename Functor> void QTimer::singleShot(Duration msec, Functor &&functor)

[static] template <typename Duration, typename Functor> void QTimer::singleShot(Duration msec, Qt::TimerType timerType, Functor &&functor)

[static] template <typename Duration, typename Functor> void QTimer::singleShot(Duration msec, Qt::TimerType timerType, const QObject *context, Functor &&functor)

[static] template <typename Duration, typename Functor> void QTimer::singleShot(Duration msec, const QObject *context, Functor &&functor)

此静态函数在 msec 毫秒后调用 functor

使用此函数非常方便,因为它不需要处理 timerEvent 或创建本地 QTimer 对象。

如果指定了 context,则只有当 context 对象在间隔发生之前未被销毁时,才会调用 functor。然后,会在 context 的线程中运行此函数。context的线程必须有一个正在运行的Qt事件循环。

如果 functorcontext 的成员函数,则该函数将在对象上调用。

msec 参数可以是 intstd::chrono::milliseconds 值。

注意: 此函数是 可重入的

另请参阅 start()。

[explicit] QTimer::QTimer(QObject *parent = nullptr)

使用给定的 parent 构建定时器。

[virtual noexcept] QTimer::~QTimer()

销毁定时器。

template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(Functor &&slot)

从定时器的 timeout() 信号创建到 slot 的连接。返回连接的句柄。

提供此方法是为了方便。它与调用

QObject::connect(timer, &QTimer::timeout, timer, slot, Qt::DirectConnection);

注意: 当定义 QT_NO_CONTEXTLESS_CONNECT 时,此重载不可用,而是使用接受上下文对象的 callOnTimeout() 重载。

另请参阅 QObject::connect() 和 timeout

template <typename Functor> QMetaObject::Connection QTimer::callOnTimeout(const QObject *context, Functor &&slot, Qt::ConnectionType connectionType = Qt::AutoConnection)

此函数重载 callOnTimeout()。

timeout()信号创建到将在context的特定事件循环中放置的slot的连接,并返回连接句柄。

提供此方法是为了方便。它与调用

QObject::connect(timer, &QTimer::timeout, context, slot, connectionType);

另请参阅 QObject::connect() 和 timeout

std::chrono::milliseconds QTimer::intervalAsDuration() const

返回计时器间隔作为std::chrono::milliseconds对象。

另请参阅:interval

bool QTimer::isActive() const

如果计时器正在运行(挂起),则返回true;否则返回false。

注意:属性active的获取函数。

std::chrono::milliseconds QTimer::remainingTimeAsDuration() const

std::chrono::milliseconds对象返回此计时器对象剩余的时间。如果此计时器到时或逾期,则返回值是std::chrono::milliseconds::zero()。如果无法找到剩余时间或计时器未处于活动状态,则此函数返回一个负的持续时间。

另请参阅:remainingTime

[静态] void QTimer::singleShot(int msec, const QObject *receiver, const char *member)

此静态函数在给定的时间间隔后调用槽。

使用此函数非常方便,因为它不需要处理 timerEvent 或创建本地 QTimer 对象。

示例

#include <QApplication>
#include <QTimer>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QTimer::singleShot(600000, &app, QCoreApplication::quit);
    ...
    return app.exec();
}

此示例程序将在10分钟后(600,000毫秒)自动终止。

receiver是接收对象,member是槽。时间间隔是msec毫秒。

注意: 此函数是 可重入的

另请参阅:setSingleShot()和start

[静态] void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, const char *member)

这是一个重载函数。

此静态函数在给定的时间间隔后调用槽。

使用此函数非常方便,因为它不需要处理 timerEvent 或创建本地 QTimer 对象。

receiver是接收对象,member是槽。时间间隔为msec毫秒。计时器类型timerType影响计时器的精度。

注意: 此函数是 可重入的

另请参阅 start()。

[静态] void QTimer::singleShot(std::chrono::milliseconds msec, const QObject *receiver, const char *member)

这是一个重载函数。

此静态函数在给定的时间间隔后调用槽。

使用此函数非常方便,因为它不需要处理 timerEvent 或创建本地 QTimer 对象。

receiver是接收对象,member是槽。时间间隔在持续时间对象msec中给出。

注意: 此函数是 可重入的

另请参阅 start()。

[静态] void QTimer::singleShot(std::chrono::milliseconds msec, Qt::TimerType timerType, const QObject *receiver, const char *member)

这是一个重载函数。

此静态函数在给定的时间间隔后调用槽。

使用此函数非常方便,因为它不需要处理 timerEvent 或创建本地 QTimer 对象。

receiver是接收对象,member是槽。时间间隔在持续时间对象msec中给出。计时器类型timerType影响计时器的精度。

注意: 此函数是 可重入的

另请参阅 start()。

[槽] void QTimer::start(int msec)

使用msec毫秒的超时间隔启动或重新启动计时器。

如果计时器已经在运行,它将被停止并重新启动。

如果 singleShot 为真,计时器只会激活一次。这相当于

timer.setInterval(msec);
timer.start();

注意: 使用零计时器的空闲事件循环注定会引发麻烦,并导致UI行为非常不稳定。

[slot] void QTimer::start()

此函数重载了 start()。

使用在 interval 中指定的超时时间启动或重新启动计时器。

如果计时器已经在运行,它将被停止并重新启动。

如果 singleShot 为真,计时器只会激活一次。

void QTimer::start(std::chrono::milliseconds msec)

这是一个重载函数。

使用 msec 毫秒的超时时间启动或重新启动计时器。

如果计时器已经在运行,它将被停止并重新启动。

如果 singleShot 为真,计时器只会激活一次。这相当于

timer.setInterval(msec);
timer.start();

[slot] void QTimer::stop()

停止计时器。

另请参阅 start()。

[private signal] void QTimer::timeout()

当计时器超时时,将发出此信号。

注意: 这是一个私有信号。它可以在信号连接中使用,但不能由用户触发。

另请参见 intervalstart() 和 stop()。

[override virtual protected] void QTimer::timerEvent(QTimerEvent *e)

重新实现了:QObject::timerEvent(QTimerEvent *event).

int QTimer::timerId() const

如果计时器正在运行,则返回计时器的ID;否则返回 -1。

© 2024 Qt 公司有限公司。本文件中所包含的文档贡献者是各自所有权的版权所有者。本文件所述文档根据自由软件基金会发布的GNU自由文档许可版本1.3 的条款进行许可。Qt及其相关标志是芬兰的Qt公司以及全球其他国家和地区注册的商标。所有其他商标均为其各自所有者的财产。