1. QTimer单次执行概述
QTimer定时器默认是启动后一直循环执行,直至停止,当然,其也提供了对一般情况设置单次执行的方法setSingleShot(true);
使用如下
QTimer *timer = new QTimer();
timer->setSingleShot(true);
timer->start(1000); // ms
而针对简单场景,如此设置较为繁琐,且需要额外维护一个变量,占用不必要资源。
那么Qt框架就提供了一个单次触发的静态方法QTimer::singleShot()
,用于在指定的时间间隔后执行一次特定的操作。这是一个非常方便的工具,特别适合需要延迟执行某些操作的场景。
2. QTimer::singleShot()
使用
QTimer::singleShot()
有多种重载版本,常用的方法版本如下:
-
void QTimer::singleShot(int msec, const QObject *receiver, const char *member)
- msec – 延迟的毫秒数
- receiver – 接收信号的对象指针
- member – 槽函数或信号名称
示例:
// 在MyClass类中使用如下代码:1000ms后执行MyClass::mySlot函数 QTimer::singleShot(1000, this, &MyClass::mySlot);
-
void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, const char *member)
-
msec – 延迟的毫秒数
-
timerType – 指定定时器类型,有如下三种,对定时误差有要求的场景需要使用此参数
Qt::PreciseTimer
(精确定时器):提供最高精度的定时器,通常能达到约1毫秒的精度,偏差通常在1-2毫秒内,但是最消耗资源;Qt::CoarseTimer
(粗粒度定时器,默认类型):平衡精度和资源消耗,精度通常在1-15毫秒之间,取决于操作系统,最高约5%的偏差;Qt::VeryCoarseTimer
(非常粗粒度定时器):最节省系统资源,但精度通常在1秒左右,最高可能会有±1秒的偏差。-
receiver – 接收信号的对象指针
-
member – 槽函数或信号名称(字符串形式)
示例:
QTimer::singleShot(1000, Qt::PreciseTimer, this, &MyClass::mySlot);
-
-
void QTimer::singleShot(int mse, Functor &&functor)
- msec – 延迟的毫秒数
- functor – 可调用对象(如 Lambda 表达式)
示例:
QTimer::singleShot(1000, [](){ qDebug() << "1秒后执行"; });
注意:
每个版本的第一个参数都是设置延时时间,默认单位是毫秒,可认为填入的是int类型值。
不过,实际上在新版的源码中,默认传入参数是std::chrono::milliseconds msec
类型参数,在未包含chorno
库时,默认传入的是Duration interval
类型参数,实际上随后也会默认调用std::chrono::milliseconds msec
重载类型的方法。
对于Duration interval
参数,使用
类型变量传入,那就不仅提供毫秒,还提供秒、纳秒等多种时间单位:std::chrono
类型 | 说明 |
---|---|
std::chrono::nanoseconds |
纳秒 (1/1,000,000,000秒) |
std::chrono::microseconds |
微秒 (1/1,000,000秒) |
std::chrono::milliseconds |
毫秒 (1/1,000秒) |
std::chrono::seconds |
秒 |
std::chrono::minutes |
分钟 |
std::chrono::hours |
小时 |
··· | ··· |
示例:QTimer::singleShot(std::chrono::seconds(1), this, &MyClass::mySlot);