QT定时器
QT定时器
QT实现定时器常用的方法有两种:QObject类提供的定时器和QTimer类。
使用定时器能够实现很多功能:定时更新UI、控制定时任务、进度条等。
QObject类提供的定时器
第一步:开启定时器。
timerId = this->startTimer(1000);// 返回定时器编号,设置计时器间隔为1000毫秒(1秒)
第二步:定时器响应事件,每次间隔1秒时间后会进入timerEvent函数。
void MyClass::timerEvent(QTimerEvent *event){
if (event->timerId() != timerId)//判断是哪个定时器
return;
}
第三步:定时器停止。
this->killTimer(timerId);
QTimer类
第一步:创建QTimer对象。
QTimer *timer = new QTimer(this);
第二步:将QTimer的timeout()信号连接到自定义槽函数上,计时器时间到达时执行相应的槽函数。
connect(timer, timeout(), this, onTimeout());
第三步:启动定时器。
timer->start(1000); // 设置计时器间隔为1000毫秒(1秒)
启动之后每秒中都会触发onTimeout()函数。
如果只想让被触发一次,那么在启动定时器前用setSingleShot(true),设置为单次触发。
QTimer *timer = new QTimer(this);
connect(timer, timeout(), this, onTimeout());
timer->setSingleShot(true);
timer->start(1000);
或者用singleShot实现单次触发。
// 写法1
QTimer::singleShot(1000,this,SLOT(onTimeout()));
// 写法2
QTimer::singleShot(1000,onTimeout);
// 写法3
QTimer *timer = new QTimer(this);
timer->singleShot(1000,onTimeout);
第四步:不需要定时器后,先停止定时器再销毁,以免内存泄漏。
timer->stop();
delete timer;
两者区别和联系
QTimer更加灵活些,依赖信号和槽,能够实现多次触发和单次触发,但是资源占用率高;QObject类提供的定时器不能单次触发,需要手动管理定时器(需要判断中断的定时器的ID)。
定时器的精度依赖于操作系统和硬件,大多数平台支持20ms的精确度,如果要实现很精确的时钟还是得用外部硬件触发时钟。
除了QTimer和QObject类,QBasicTimer也能实现定时器,但是通常不建议在上层应用中使用,一般用在QT内部,做应用的话更加推荐QTimer和QObject类。所以本篇就不对QBasicTimer类做介绍了。