自学内容网 自学内容网

C++| QT定时器QTimer

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类做介绍了。


原文地址:https://blog.csdn.net/qq_40306845/article/details/137638477

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!