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 的替代是调用 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
()
销毁计时器。
这是重载函数。
创建连接,类型为 connectionType 从 timeout () 信号到 slot ,并返回要连接的句柄。
此方法为方便起见提供。它相当于调用
QObject::connect(timer, &QTimer::timeout, timer, slot, connectionType)
.
另请参阅 QObject::connect () 和 timeout ().
此函数重载 callOnTimeout()。
创建连接从 timeout () 信号到 slot 以放置在特定事件循环 context ,并返回要连接的句柄。
此方法为方便起见提供。它相当于调用
QObject::connect(timer, &QTimer::timeout, context, slot, connectionType)
.
另请参阅 QObject::connect () 和 timeout ().
此函数重载 callOnTimeout()。
创建连接从 timeout () 信号到 slot 在 receiver 对象。返回连接的句柄。
此方法为方便起见提供。它相当于调用
QObject::connect(timer, &QTimer::timeout, receiver, 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]
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 是槽。时间间隔被给出由持续时间对象 msec 。 timerType 影响计时器精度。
注意: 此函数是 可重入 .
另请参阅 start ().
[slot]
void
QTimer::
start
(
int
msec
)
启动 (或重启) 计时器采用超时间隔 msec 毫秒。
若计时器已经在运行,它会被 stopped 并重启。
若 singleShot 为 true,计时器将仅被激活一次。
注意: 采用 0 计时器使事件循环保持忙碌必然导致故障, 且 UI 的行为会高度不稳定。
[slot]
void
QTimer::
start
()
此函数重载 start()。
启动 (或重启) 计时器采用指定超时在 interval .
若计时器已经在运行,它会被 stopped 并重启。
若 singleShot 为 true,计时器将仅被激活一次。
这是重载函数。
启动 (或重启) 计时器,采用超时持续时间 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).
返回计时器的 ID,若计时器正在运行;否则返回 -1。