QTimer 类

QTimer 类提供重复 (和单发) 计时器。 更多...

头: #include <QTimer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
继承: QObject

特性

公共函数

QTimer (QObject * parent = nullptr)
virtual ~QTimer ()
QBindable<bool> bindableActive ()
QBindable<int> bindableInterval ()
QBindable<bool> bindableSingleShot ()
QBindable<Qt::TimerType> bindableTimerType ()
QMetaObject::Connection callOnTimeout (Functor slot , Qt::ConnectionType connectionType = Qt::AutoConnection)
QMetaObject::Connection callOnTimeout (const QObject * context , Functor slot , Qt::ConnectionType connectionType = Qt::AutoConnection)
QMetaObject::Connection callOnTimeout (const QObject * receiver , MemberFunction * slot , Qt::ConnectionType connectionType = Qt::AutoConnection)
int interval () const
std::chrono::milliseconds intervalAsDuration () const
bool isActive () const
bool isSingleShot () const
int remainingTime () const
std::chrono::milliseconds remainingTimeAsDuration () const
void setInterval (int msec )
void setInterval (std::chrono::milliseconds value )
void setSingleShot (bool singleShot )
void setTimerType (Qt::TimerType atype )
void start (std::chrono::milliseconds msec )
int timerId () const
Qt::TimerType timerType () const

公共槽

void start (int msec )
void start ()
void stop ()

信号

void timeout ()

静态公共成员

void singleShot (int msec , const QObject * receiver , const char * member )
void singleShot (int msec , Qt::TimerType timerType , const QObject * receiver , const char * member )
void singleShot (int msec , const QObject * receiver , PointerToMemberFunction method )
void singleShot (int msec , Qt::TimerType timerType , const QObject * receiver , PointerToMemberFunction method )
void singleShot (int msec , Functor functor )
void singleShot (int msec , Qt::TimerType timerType , Functor functor )
void singleShot (int msec , const QObject * context , Functor functor )
void singleShot (int msec , Qt::TimerType timerType , const QObject * context , Functor functor )
void singleShot (std::chrono::milliseconds msec , const QObject * receiver , const char * member )
void singleShot (std::chrono::milliseconds msec , Qt::TimerType timerType , const QObject * receiver , const char * member )

重实现保护函数

virtual void timerEvent (QTimerEvent * e ) override

详细描述

QTimer 类为计时器提供高级编程接口。要使用它,创建 QTimer,连接其 timeout () 信号到适当槽,并调用 start ()。从那时起,它将发射 timeout () 信号按常量间隔。

一秒 (1000 毫秒) 计时器范例 (来自 指针式时钟 范例):

    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 () signal. Because of this, you must start and stop the timer in its thread; it is not possible to start a timer from another thread.

作为特殊情况,采用 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 毫秒。精密计时器也从不会比期望超时提前。

For Qt::CoarseTimer and Qt::VeryCoarseTimer 类型,QTimer 的唤醒可能早于期望,在这些类型的边距内:间隔 5% 对于 Qt::CoarseTimer 和 500 ms 对于 Qt::VeryCoarseTimer .

所有计时器类型的超时均可能晚于期望,若系统繁忙 (或无法提供要求的精度)。在这种超时超限情况下,Qt 会发射 timeout () 仅一次,即使有多个超时过期,然后再继续原始间隔。

替代 QTimer

使用 QTimer 的替代是调用 QObject::startTimer () 为对象并重实现 QObject::timerEvent () 事件处理程序在类中 (必须继承 QObject )。缺点是 timerEvent () 不支持如单次计时器 (或信号) 的高级特征。

另一替代是 QBasicTimer 。通常不那么麻烦相比使用 QObject::startTimer () 直接。见 计时器 了解所有 3 种途径的概述。

某些操作系统限制可能使用的计时器数;Qt 试着绕过这些局限性。

另请参阅 QBasicTimer , QTimerEvent , QObject::timerEvent (), 计时器 , 指针式时钟 ,和 俄罗斯方块范例 .

特性文档编制

[bindable read-only] active : bool

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

此布尔特性为 true 若计时器正在运行;否则 false。

[bindable] interval : int

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

此特性保持超时间隔 (以毫秒为单位)

此特性的默认值为 0。 QTimer 采用 0 超时间隔会尽快超时,在已处理窗口系统事件队列中的所有事件后。

设置活动计时器的间隔会改变其 timerId ().

另请参阅 singleShot .

[read-only] remainingTime : const int

此特性保持剩余时间 (以毫秒为单位)

返回计时器的剩余值 (以毫秒为单位) 直到超时。若计时器处于非活动状态,返回值会为 -1。若计时器过期,返回值会为 0。

访问函数:

int remainingTime () const

另请参阅 interval .

[bindable] singleShot : bool

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

此特性保持计时器是否为单次计时器

单发计时器仅激发一次,非单发计时器被激发每隔 interval 毫秒。

此特性的默认值为 false .

另请参阅 interval and singleShot ().

[bindable] timerType : Qt::TimerType

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

控制计时器的精度

此特性的默认值为 Qt::CoarseTimer .

另请参阅 Qt::TimerType .

成员函数文档编制

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

构造计时器采用给定 parent .

[虚拟] QTimer:: ~QTimer ()

销毁计时器。

template <typename Functor> QMetaObject::Connection QTimer:: callOnTimeout ( Functor slot , Qt::ConnectionType connectionType = Qt::AutoConnection)

这是重载函数。

创建连接,类型为 connectionType timeout () 信号到 slot ,并返回要连接的句柄。

此方法为方便起见提供。它相当于调用 QObject::connect(timer, &QTimer::timeout, timer, slot, connectionType) .

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

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

此函数重载 callOnTimeout()。

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

此方法为方便起见提供。它相当于调用 QObject::connect(timer, &QTimer::timeout, context, slot, connectionType) .

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

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

此函数重载 callOnTimeout()。

创建连接从 timeout () 信号到 slotreceiver 对象。返回连接的句柄。

此方法为方便起见提供。它相当于调用 QObject::connect(timer, &QTimer::timeout, receiver, slot, connectionType) .

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

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

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

另请参阅 interval .

bool QTimer:: isActive () const

返回 true 若计时器正在运行 (待决);否则返回 false。

注意: getter 函数对于特性 active .

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

把此计时器对象的剩余时间返回作为 std::chrono::milliseconds 对象。若此计时器到期 (或过期),返回值为 std::chrono::milliseconds::zero() 。若找不到剩余时间 (或计时器未激活),此函数返回负持续时间。

另请参阅 remainingTime ().

[static] 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 毫秒) 后自动终止。

The receiver 是接收对象而 member 是槽。时间间隔为 msec 毫秒。

注意: 此函数是 可重入 .

另请参阅 setSingleShot () 和 start ().

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

这是重载函数。

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

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

The receiver 是接收对象而 member 是槽。时间间隔为 msec 毫秒。 timerType 影响计时器精度。

注意: 此函数是 可重入 .

另请参阅 start ().

[static] template <typename PointerToMemberFunction> void QTimer:: singleShot ( int msec , const QObject * receiver , PointerToMemberFunction method )

这是重载函数。

此静态函数调用成员函数对于 QObject 在给定时间间隔后。

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

The receiver 是接收对象而 method 是成员函数。时间间隔为 msec 毫秒。

receiver 被销毁在间隔出现前,方法不会被调用。函数将运行在线程对于 receiver 。接收者线程必须拥有正在运行的 Qt 事件循环。

注意: 此函数是 可重入 .

另请参阅 start ().

[static] template <typename PointerToMemberFunction> void QTimer:: singleShot ( int msec , Qt::TimerType timerType , const QObject * receiver , PointerToMemberFunction method )

这是重载函数。

此静态函数调用成员函数对于 QObject 在给定时间间隔后。

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

The receiver 是接收对象而 method 是成员函数。时间间隔为 msec 毫秒。 timerType 影响计时器精度。

receiver 被销毁在间隔出现前,方法不会被调用。函数将运行在线程对于 receiver 。接收者线程必须拥有正在运行的 Qt 事件循环。

注意: 此函数是 可重入 .

另请参阅 start ().

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

这是重载函数。

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

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

时间间隔为 msec 毫秒。

注意: 此函数是 可重入 .

另请参阅 start ().

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

这是重载函数。

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

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

时间间隔为 msec 毫秒。 timerType 影响计时器精度。

注意: 此函数是 可重入 .

另请参阅 start ().

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

这是重载函数。

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

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

时间间隔为 msec 毫秒。

context 被销毁在间隔出现前,方法不会被调用。函数将运行在线程对于 context 。上下文线程必须拥有正在运行的 Qt 事件循环。

注意: 此函数是 可重入 .

另请参阅 start ().

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

这是重载函数。

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

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

时间间隔为 msec 毫秒。 timerType 影响计时器精度。

context 被销毁在间隔出现前,方法不会被调用。函数将运行在线程对于 context 。上下文线程必须拥有正在运行的 Qt 事件循环。

注意: 此函数是 可重入 .

另请参阅 start ().

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

这是重载函数。

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

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

The receiver 是接收对象而 member 是槽。时间间隔被给出由持续时间对象 msec .

注意: 此函数是 可重入 .

另请参阅 start ().

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

这是重载函数。

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

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

The receiver 是接收对象而 member 是槽。时间间隔被给出由持续时间对象 msectimerType 影响计时器精度。

注意: 此函数是 可重入 .

另请参阅 start ().

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

启动 (或重启) 计时器采用超时间隔 msec 毫秒。

若计时器已经在运行,它会被 stopped 并重启。

singleShot 为 true,计时器将仅被激活一次。

注意: 采用 0 计时器使事件循环保持忙碌必然导致故障, 且 UI 的行为会高度不稳定。

[slot] void QTimer:: start ()

此函数重载 start()。

启动 (或重启) 计时器采用指定超时在 interval .

若计时器已经在运行,它会被 stopped 并重启。

singleShot 为 true,计时器将仅被激活一次。

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

这是重载函数。

启动 (或重启) 计时器,采用超时持续时间 msec 毫秒。

若计时器已经在运行,它会被 stopped 并重启。

singleShot 为 true,计时器将仅被激活一次。

[slot] void QTimer:: stop ()

停止计时器。

另请参阅 start ().

[private signal] void QTimer:: timeout ()

此信号被发射当计时器超时。

注意: 这是私有信号。它可以用于信号连接,但不能由用户发射。

另请参阅 interval , start (),和 stop ().

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

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

int QTimer:: timerId () const

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