zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Qt之QTimer

Qt
2023-09-11 14:19:16 时间

QTimer类为定时器提供了一个高级别的编程接口。很容易使用:首先,创建一个QTimer,连接timeout()信号到适当的槽函数,并调用start(),然后在恒定的时间间隔会发射timeout()信号。

注意:当QTimer的父对象被销毁时,它也会被自动销毁。


Qt之模拟时钟中,1秒(1000毫秒)更新一次:

QTimer *timer = new QTimer(this);

connect(timer, SIGNAL(timeout()), this, SLOT(update()));

timer- start(1000);

start()之后,每秒都会调用update()。

可以通过设置setSingleShot(true)来让定时器只执行一次。也可以使用静态函数QTimer::singleShot():


在多线程程序中,可以在一个有事件循环的任何线程中使用QTimer。使用QThread::exec(),从非GUI线程启动一个事件循环。 Qt使用定时器的线程关联,以确定哪个线程会发出timeout()信号。正因为如此,你必须在它的线程中启动和停止定时器,不可能从另一个线程启动定时器。

作为一个特例,一旦窗口系统事件队列中的所有事件都已经被处理完,一个定时为0的QTimer就会到时间了。当需要提供流畅的用户界面时,可以用这来做比较繁重的工作。


QTimer *timer = new QTimer(this);

connect(timer, SIGNAL(timeout()), this, SLOT(processOneThing()));

timer- start();

这时,processOneThing()将会被重复调用并且应该很快返回(通常在处理一个数据项之后),这样Qt可以把事件传送给窗口部件,并且一旦它完成这个工作就停止这个定时器。这是在图形用户界面应用程序中实现繁重的工作的一个典型方法,现在多线程可以在越来越多的平台上使用,我们希望0-毫秒QTimer对象最终被线程替代。


定时器的精度取决于底层操作系统和硬件。绝大多数平台支持精度为1毫秒,尽管定时器的准确性在许多现实世界的情况下和这不相符。

准确性也取决于定时器类型(Qt::TimerType)。对于Qt::PreciseTimer来说,QTimer将试图保持精确度在1毫秒。精确的定时器也从来不会比预计的还要早超时。

对于Qt::CoarseTimer和Qt::VeryCoarseTimer类型,QTimer可能早于预期,在间隔之内被唤醒:Qt::CoarseTimer为间隔的5%,Qt::VeryCoarseTimer为500毫秒。

枚举Qt::TimerType:


在UNIX (包括: Linux、OS X、iOS)中,Qt将为Qt::PreciseTimer保持毫秒精度,对于Qt::CoarseTimer,间隔将调整到5%,使定时器与其他定时器匹配或在差不多在同一时间,目标是让大多数定时器在同一时间醒来,从而减少CPU唤醒和功耗。

在Windows上,Qt将为Qt::PreciseTimer使用Windows的多媒体定时器工具(如果可用),为Qt::CoarseTimer和Qt::VeryCoarseTimer使用正常的Windows定时器。

所有平台上,Qt::VeryCoarseTimer的间隔被四舍五入到最接近完整的第二位(例如:23500ms的时间间隔将被舍入到24000ms,20300ms舍入至20000)。


另一个使用QTimer的方法:为你的对象调用QObject::startTimer(),在你的类中(必须继承QObject)重新实现QObject::timerEvent()事件处理器。缺点是timerEvent()不支持像单次触发定时器或信号那样的高级特性。

另一个选择是QBasicTimer。它通常比使用QObject::startTimer() 直接。可以查看助手中Timers描述的三种方法。

一些操作系统限制可能会限制定时器的数量,Qt会尽力在限制范围内工作。

可参考:QBasicTimer、QTimerEvent、QObject::timerEvent()、Timers、Analog Clock Example、Wiggly Example。


默认值是0,这时,一旦窗口系统事件队列中的所有事件都已经被处理完,一个时间间隔为0的QTimer就会触发。


void setTimerType(Qt::TimerType atype)
设置定时器的准确性。默认值是Qt::CoarseTimer。

int timerId() const
如果定时器正在运行,返回定时器的ID,否则返回-1。

void start(int msec)
启动或重新启动一个超时时间间隔为毫秒的定时器。

如果定时器正在运行,它将被停止和重新启动。如果singleShot为true,定时器将只激活一次。

void start()
同上,重载了start()。

void stop()
停止定时器。


QPushButton *pStartButton = new QPushButton(this);

QPushButton *pStopButton = new QPushButton(this);

m_pProgressBar = new QProgressBar(this);

m_pTimer = new QTimer();

pStartButton- setText(QString::fromLocal8Bit("开始"));

pStopButton- setText(QString::fromLocal8Bit("停止"));

m_pProgressBar- setRange(0, 100);

m_pProgressBar- setValue(50);

// 设置超时间隔

m_pTimer- setInterval(1000);

// 连接信号槽

connect(pStartButton, SIGNAL(clicked(bool)), m_pTimer, SLOT(start()));

connect(pStopButton, SIGNAL(clicked(bool)), m_pTimer, SLOT(stop()));

connect(m_pTimer, SIGNAL(timeout()), this, SLOT(updateProgress()));

// 槽函数

void MainWindow::updateProgress()

 // 获取当前进度值,+1

 int nCurrentValue = m_pProgressBar- value();

 nCurrentValue++;

 if (nCurrentValue = 100)

 m_pTimer- stop();

 // 设置新的进度值

 m_pProgressBar- setValue(nCurrentValue);

}

在槽函数updateProgress()中,首先通过m_pProgressBar- value()来获取当前进度值,然后加1,当进度大于等于100时停止定时器(再继续执行已经没任何意义了,因为进度已经达到了100,而且不停止还消耗资源),然后设置进度条的值。


上节讲述了关于QPropertyAnimation实现等待提示框的显示,本节我们使用另外一种方案来实现-使用定时器QTimer,通过设置超时时间定时更新图标达到旋转效果。
Qt+ECharts开发笔记(五):ECharts的动态排序柱状图介绍、基础使用和Qt封装Demo 上一篇的demo使用隐藏js代码的方式,实现了一个饼图的基本交互方式,并预留了Qt模块对外的基础接口。   本篇的demo实现了自动排序的柱状图,实现了一个自动排序柱状图的基本交互方式,即Qt调用js脚本操作html。   本篇demo使用Qt定时器方式,实现数据定时刷新自增,并预留出了定时器间隔参数。   像大数据网页常看的人口增长时间图,收入年度增长时间图等都是这一类。
Qt+ECharts开发笔记(四):ECharts的饼图介绍、基础使用和Qt封装百分比图Demo 前一篇介绍了横向柱图图。本篇将介绍基础饼图使用,并将其封装一层Qt。本篇的demo使用隐藏js代码的方式,实现了一个饼图的基本交互方式,并预留了Qt模块对外的基础接口。
Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件 上一篇已经将himpp套入qt的基础上进行开发。那么qt中拿到frame则是很关键的交互,这是qt与海思可能编解码交叉开发的关键步骤。
Qt+ECharts开发笔记(三):ECharts的柱状图介绍、基础使用和Qt封装Demo 上一篇成功是EChart随着Qt窗口变化而变化,本篇将开始正式介绍柱状图介绍、基础使用,并将其封装一层Qt。   本篇的demo实现了隐藏js代码的方式,实现了一个条形图的基本交互方式,即Qt调用js脚本操作html。