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
。
计时器的准确性取决于底层操作系统和硬件。大多数平台支持 1 毫秒的分辨率,虽然计时器的准确性在许多真实世界状况下不会等于此分辨率。
精度还取决于 计时器类型 。对于 Qt::PreciseTimer ,QTimer 将试着把精度保持在 1 毫秒。精密计时器也从不会比期望超时提前。
For Qt::CoarseTimer and Qt::VeryCoarseTimer 类型,QTimer 的唤醒可能早于期望,在这些类型的边距内:间隔 5% 对于 Qt::CoarseTimer 和 500 ms 对于 Qt::VeryCoarseTimer .
所有计时器类型的超时均可能晚于期望,若系统繁忙 (或无法提供要求的精度)。在这种超时超限情况下,Qt 会发射 timeout () 仅一次,即使有多个超时过期,然后再继续原始间隔。
使用 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
()
销毁计时器。
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);
注意:
This overload is not available when
QT_NO_CONTEXTLESS_CONNECT
is defined, instead use the callOnTimeout() overload that takes a context object.
另请参阅 QObject::connect () 和 timeout ().
此函数重载 callOnTimeout()。
创建连接从 timeout () 信号到 slot 以放置在特定事件循环 context ,并返回要连接的句柄。
This method is provided for convenience. It's equivalent to calling:
QObject::connect(timer, &QTimer::timeout, context, slot, connectionType);
另请参阅 QObject::connect () 和 timeout ().
把此计时器的间隔返回作为
std::chrono::milliseconds
对象。
另请参阅 interval .
返回
true
若计时器正在运行 (待决);否则返回 false。
注意: getter 函数对于特性 active .
把此计时器对象的剩余时间返回作为
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,计时器将仅被激活一次。
这是重载函数。
启动 (或重启) 计时器,采用超时持续时间 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).
返回计时器的 ID,若计时器正在运行;否则返回 -1。