- QBasicTimer
这个定时器类是一个 轻量级的、较底层的、被Qt内部使用的定时器类。如果在你的应用程序中使用定时器类,推荐使用QTimer类,而不是这个类。该类和QTimer类类似,也提供start、isActive、stop函数接口。该类的对象不支持复制,即没有拷贝构造函数和赋值函数,但支持移动语义,所以可以在支持移动语义的容器(如:std::vector)中维护该类对象的列表。Qt官方自带的例子 Examples\Qt-XX.XX.XX\widgets\widgets\wiggly 工程讲解了该定时器类的用法(Example在Qt的安装目录下,其中XX.XX.XX为Qt的版本号,如:5.14.1)。 - startTimer
该函数是QObject类的函数。启动一个定时器并返回该定时器基于整形的定时器id。其有如下两个重载函数:
int QObject::startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)
int QObject::startTimer(std::chrono::milliseconds time, Qt::TimerType timerType = Qt::CoarseTimer)
当调用startTimer后,每隔interval毫秒(第1个函数)或time(第2个函数)就会发送一个定时器事件,直到 killTimer函数被调用才停止发送。如果interval或time为0,则每次当系统中再也没有其它事件即当事件队列中的事件全部处理完时才会发送一次定时器事件。当定时器事件发生时,QOjbect或其子类可以在虚函数timerEvent中捕捉定时器事件,timerEvent函数的参数就是QTimerEvent对象即定期是事件对象。如果有多个定时器正在运行,可以用 QTimerEvent::timerId()找出哪个是正在激活使用的定时器。
class MyObject : public QObject
{
Q_OBJECT
public:
MyObject(QObject *parent = nullptr);
protected:
void timerEvent(QTimerEvent *event) override;
};
MyObject::MyObject(QObject *parent)
: QObject(parent)
{
startTimer(50);
startTimer(1000);
startTimer(60000);
using namespace std::chrono;
startTimer(milliseconds(50));
startTimer(seconds(1));
startTimer(minutes(1));
startTimer(100ms);
startTimer(5s);
startTimer(2min);
startTimer(1h);
}
void MyObject::timerEvent(QTimerEvent *event)
{
qDebug() << "Timer ID:" << event->timerId();
}
注意:定时器的精度依赖于操作系统和硬件。timerType参数可以用来自定义定时器精度,具体可以查看Qt assist对Qt::TimerType 枚举的描述。大部分的平台支持20ms的精度,如果Qt不能提供指定要求的定时器事件,则它会默默地丢弃一些定时器事件。 3. QTimer 这个是比较高端的定时器类,建议大家用这个。这个应该是大家用的比较多的了,故在此不再详述,请参考Qt assist中的说明。
|