简述
最近看到有用startTimer()配合timerEvent()来实现定时执行的用法,甚是不错,记录一下。
为了全面性,顺带介绍使用QTimer实现定时执行的常用方法,并结合代码示例。
QTimer常见用法
QTimer实现定时执行的方法想必大家都无比熟悉,直接上代码进行说明。
QTimer的普遍用法如下,示例中使用QTimer每隔10s调用压缩文件函数。
//.h文件--声明QTimer对象和槽函数
public slots:
void onZipTodayFile();
private:
QTimer* filezipTimer;
//.cpp文件--实例化和连接信号槽
filezipTimer = new QTimer();
filezipTimer->setInterval(10000); //10s
connect(filezipTimer, SIGNAL(timeout()), this, SLOT(onZipTodayFile()));
filezipTimer->start();
当调用只执行一遍的操作时,可以使用QTimer的简约用法,singleShot()函数。
//.cpp文件--使用singleShot静态函数,此时不需要实例化QTimer
QTimer::singleShot(10000, this, SLOT(onZipTodayFile()));
Timerevent用法
QTimer的准确性取决于底层操作系统和硬件支持,大多数平台支持20毫秒的精度,当Qt无法交付所请求的计时器事件数量时,会自动默默地丢弃一些计时器事件。通常使用startTimer()要比QTimer有更好的效率。代码示例如下:
//.h文件
private slots:
void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE;
private:
int timerId; //用于区分不同的计时器,示例举了2个计时器的情况
int timerId2;
//.cpp文件
timerId = startTimer(200);
timerId2 = startTimer(1000);
//timerEvent()函数内
if (event->timerId() == timerId)
{
...
}
else if (event->timerId() == timerId2)
{
...
}
上述代码,在头文件中重写了timerEvent()函数,并定义了2个标识;
在源文件中开启了两个不同间隔的计时,并赋值给标识,在timerEvent()中根据不同的标识,定时执行不同的内容。
无需建立对象和连接信号槽,简单高效。高频显示刷新中一般使用这种方式。
总结
QTimer和timerEvent的功能完全一致,QTimer更为清晰和灵活,而timerEvent更为简约和高效。大家在项目中使用定时器,还是要根据项目的具体情况而定。