QTimer 类
QTimer 类提供重复和单次定时器。 更多信息...
头文件 | #include <QTimer> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
继承 | QObject |
- 所有成员列表,包括继承的成员
- QTimer 是 事件类 的一部分。
属性
|
|
公共函数
QTimer(QObject *parent = nullptr) | |
虚拟 | ~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 | 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毫秒)定时器的示例(来自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::CoarseTimer和Qt::VeryCoarseTimer类型,QTimer可能在预期时间之前唤醒,但这些类型的公差范围内:Qt::CoarseTimer为间隔的5%,Qt::VeryCoarseTimer为500毫秒。
如果系统繁忙或无法提供请求的准确性,所有定时器的超时时间可能会晚于预期。在这种情况下,如果超时超时,Qt将只发出一次timeout(),即使多个超时已经过期,然后将继续原始间隔。
QTimer的替代方案
使用QTimer的另一种方法是调用对象的QObject::startTimer(),并在你的类中重新实现QObject::timerEvent()事件处理函数(该类必须继承自QObject)。缺点是timerEvent()不支持单次射击定时器或信号等高级功能。
另一种替代方法是QBasicTimer。与直接使用QObject::startTimer()相比,它通常更简单。参见Timers了解这三种方法的概述。
某些操作系统限制可能使用的定时器数量;Qt会尝试解决这些限制。
另请参阅 QBasicTimer,QTimerEvent,QObject::timerEvent(),Timers和Analog 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。
访问函数
int | remainingTime() const |
另请参阅:interval。
[bindable]
singleShot : bool
注意:此属性支持QProperty绑定。
此属性包含定时器是否为单次定时器。
单次定时器只触发一次,非单次定时器每interval毫秒触发一次。
此属性的默认值为false
。
另请参阅:interval和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)
此静态函数在 msec 毫秒后调用 functor。
使用此函数非常方便,因为它不需要处理 timerEvent 或创建本地 QTimer 对象。
如果指定了 context,则只有当 context 对象在间隔发生之前未被销毁时,才会调用 functor。然后,会在 context 的线程中运行此函数。context的线程必须有一个正在运行的Qt事件循环。
如果 functor 是 context 的成员函数,则该函数将在对象上调用。
msec 参数可以是 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)
从定时器的 timeout() 信号创建到 slot 的连接。返回连接的句柄。
提供此方法是为了方便。它与调用
注意: 当定义 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() 和 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()
当计时器超时时,将发出此信号。
注意: 这是一个私有信号。它可以在信号连接中使用,但不能由用户触发。
另请参见 interval、start() 和 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公司以及全球其他国家和地区注册的商标。所有其他商标均为其各自所有者的财产。