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 )
QMetaObject::Connection callOnTimeout (const QObject * context , Functor && 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 (Duration msec , const QObject * context , Functor && functor )
void singleShot (Duration msec , Qt::TimerType timerType , const QObject * context , Functor && functor )
void singleShot (Duration msec , Functor && functor )
void singleShot (Duration msec , Qt::TimerType timerType , 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 s.

精度和计时器分辨率

计时器的准确性取决于底层操作系统和硬件。大多数平台支持 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 .

成员函数文档编制

[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 )

此静态函数调用 functor after msec 毫秒。

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

context is specified, then the functor will be called only if the context object has not been destroyed before the interval occurs. The functor will then be run the thread of context 。上下文线程必须拥有正在运行的 Qt 事件循环。

functor is a member function of context , then the function will be called on the object.

The msec parameter can be an int std::chrono::milliseconds 值。

注意: 此函数是 可重入 .

另请参阅 start ().

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

构造计时器采用给定 parent .

[virtual noexcept] QTimer:: ~QTimer ()

销毁计时器。

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

Creates a connection from the timer's timeout () 信号到 slot . Returns a handle to the connection.

This method is provided for convenience. It's equivalent to calling:

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

另请参阅 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 ().

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] 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 是槽。时间间隔被给出由持续时间对象 msec timerType 影响计时器精度。

注意: 此函数是 可重入 .

另请参阅 start ().

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

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

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

singleShot is true, the timer will be activated only once. This is equivalent to:

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

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

[slot] void QTimer:: start ()

此函数重载 start()。

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

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

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

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

这是重载函数。

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

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

singleShot is true, the timer will be activated only once. This is equivalent to:

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

[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。