在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器;一种是使用QTimer类。定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度。

1.QObject类的定时器

QObject是所有Qt对象的基类,它提供了一个基本的定时器。通过QObject::startTimer(),可以把一个一毫秒为单位的时间间隔作为参数来开始定时器,这个函数返回一个唯一的整数定时器的标识符。这个定时器开始就会在每一个时间间隔"触发",直到明确的使用这个定时器的标识符来调用QObject::killTimer()结束。

当定时器触发时,应用程序会发送一个QTimerEvent。在事件循环中,处理器按照事件队列的顺序来处理定时器事件。当处理器正忙于其它事件处理时,定时器就不能立即处理。

QObject类还提供定时期的功能。与定时器相关的成员函数有:startTimer()、timeEvent()、killTimer()。QObject基类中的startTimer()和timerEvent()原型及说明如下:

intQObject::startTimer(int interval);

开始一个定时器并返回定时器ID,如果不能开始一个定时器,将返回0。定时器开始后,每隔interval毫秒间隔将触发一次超时事件,直到killTimer()被调用来删除定时器。如果interval为0,那么定时器事件每次发生时没有窗口系统事件处理。

virtual voidQObject::timerEvent(QTimerEvent *event);

虚函数timerEvent()被重载来实现用户的超时事件处理函数。如果有多个定时器在运行,QTimerEvent::timerId()被用来查找指定定时器,对其进行操作。

当定时器事件发生时,虚函数timerEvent()随着QTimerEvent事件参数类一起被调用,重载这个函数可以获得定时器事件。

定时器的用法如下:

//头文件

class QNewObject : publicQObject

{

Q_OBJECT

public:

QNewObject( QObject * parent = 0 );

virtual ~QNewObject();

protected:

void timerEvent( QTimerEvent *event );

int m_nTimerId;

};

//源文件

QNewObject::QNewObject(QObject * parent )

:QNewObject( parent )

{

m_nTimerId = startTimer(1000);

}

QNewObject::~QNewObject()

{

if ( m_nTimerId != 0 )

killTimer(m_nTimerId);

}

voidQNewObject::timerEvent( QTimerEvent *event )

{

qDebug( "timer event, id %d",event->timerId() );

}

2.定时器类QTimer

定时器类QTimer提供当定时器触发的时候发射一个信号的定时器,他提供只触发一次的超时事件,通常的使用方法如下:

//创建定时器

QTimer *testTimer = newQTimer(this);

//将定时器超时信号与槽(功能函数)联系起来

connect( testTimer,SIGNAL(timeout()), this, SLOT(testFunction()) );

//开始运行定时器,定时时间间隔为1000ms

testTimer->start(1000);

...

//停止运行定时器

if (testTimer->isActive() )

testTimer->stop();

QTimer还提供了一个简单的只有一次定时的函数singleShot()。 一个定时器在100ms后触发处理函数animateTimeout()并且只触发一次。代码如下:

QTimer::singleShot( 100,this, SLOT(animateTimeout()) );

QTimer类提供了定时器信号和单触发定时器。

它在内部使用定时器事件来提供更通用的定时器。QTimer很容易使用:创建一个QTimer,使用start()来开始并且把它的timeout()连接到适当的槽。当这段时间过去了,它将会发射timeout()信号。

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

实例:

QTimer *timer = new QTimer( myObject );

connect( timer, SIGNAL(timeout()),myObject, SLOT(timerDone()) );

timer->start( 2000, TRUE ); // 2秒单触发定时器

你也可以使用静态的singleShot()函数来创建单触发定时器。

作为一个特殊情况,一旦窗口系统事件队列中的所有事件都已经被处理完,一个定时为0的QTimer就会到时间了。

这也可以用来当提供迅速的用户界面时来做比较繁重的工作。

QTimer *t = new QTimer( myObject );

connect( t, SIGNAL(timeout()), SLOT(processOneThing()));

t->start( 0, FALSE );

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

注意QTimer的精确度依赖于底下的操作系统和硬件。绝大多数平台支持20毫秒的精确度,一些平台可以提供更高的。如果Qt不能传送定时器触发所要求的数量,它将会默默地抛弃一些。

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

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

Qt中两种定时器用法相关推荐

  1. js中两种定时器,setTimeout和setInterval的区别

    2019独角兽企业重金招聘Python工程师标准>>> setTimeout只在指定时间后执行一次,代码如下: <script> //定时器 异步运行 function ...

  2. JavaScript中两种定时器和清除定时器的使用

    ​ 一.定义 定时器就是在一段特定的时间后执行某段程序代码. 二.定时器的使用 1.单次定时器(setTimeout) 以指定的时间间隔(时间单位为毫秒)调用一次函数的定时器. <script& ...

  3. matlab 遍历每个像素点,Mat中两种像素遍历方法比较

    小白,入门中,不足其指正.刚刚接触opencv,从一个Matlab风格的编程环境突然跳转到C++,实在有些不适.单就pixels scanning花了好长时间研究.opencv-tutorials给出 ...

  4. js中的两种定时器setTimeout()和setInterval()怎么用

    JS有两种定时器分别是setTimeout()和setInterval(),这两个区别就是setTimeout()是一次性的定时器,而setInterval()是循环的定时器. 定时器的精度 js中的 ...

  5. C语言getline函数CSDN,c++中的两种getline用法详解

    getline是C++标准库函数:但不是C标准库函数,而是POSIX(IEEE Std 1003.1-2008版本及以上)所定义的标准库函数(在POSIX IEEE Std 1003.1-2008标准 ...

  6. QT中三种构建菜单栏的方法

    QT中三种构建菜单栏的方法 方法1 <C++ GUI programming with Qt 4, Second Edition>给出的一种方法:QMenum定义单个菜单,调用menuBa ...

  7. java两种绑定方式_java两种单例模式用法分析

    本文实例讲述了java两种单例模式用法.分享给大家供大家参考,具体如下: 按照加载方式的不同,单例模式有两种实现: private:只能在同一个类中使用 static:该类是类方法,不能调用实例方法. ...

  8. R中两种常用并行方法——2. snowfall

    上一篇博客(R中两种常用并行方法--1. parallel)中已经介绍了R中常见的一种并行包:parallel,其有着简单便捷等优势,其实缺点也是非常明显,就是很不稳定.很多时候我们将大量的计算任务挂 ...

  9. 函数指针--Nginx和Redis中两种回调函数写法

    1.Nginx和Redis中两种回调函数写法 #include <stdio.h>//仿Nginx风格 //结构外声明函数指针类型 typedef void (*ngx_connectio ...

最新文章

  1. mysql基于传统的log_file及log_pos主从复制
  2. 解决Office 2016客户端如何同SharePoint Server2016安装在一起
  3. 购买7个球彩票(人输入or机输入)(python )
  4. 线段树专题-等差子序列 BZOJ-2124
  5. 【POJ】2065 SETI
  6. Spring Cloud笔记-Maven构建父子项目
  7. 学历全靠编,融资靠忽悠?网传“包养7个女主持”的金融大佬被揭穿了
  8. 宝石光是什么石头_沙漠戈壁的漂亮“石头”让人见了流口水
  9. PHP获取汉字首字母并分组排序
  10. 图解C#的值类型,引用类型,栈,堆,ref,out
  11. 拓端tecdat|R语言DTW(Dynamic Time Warping) 动态时间规整算法分析序列数据和可视化
  12. PHP 数组常用操作函数随记
  13. 基于基因数据的神经网络模式分类研究
  14. 383-基于kintex UltraScale XCKU040的双路QSFP+光纤PCIe 卡
  15. Package javax.naming
  16. SpringBoot2.x(三)热部署devtool和配置文件自动注入实战
  17. 微信小程序二手跳蚤市场系统设计毕业设计论文
  18. 技术分享 | 使用 cURL 发送请求
  19. 关于软碟通UltraISO制作Ubuntu系统盘无法启动,推荐制作启动盘使用免费软件rufus
  20. 西门子s7协议 android,工控协议 | 西门子S7协议学习分享

热门文章

  1. 自动配置IPv4问题
  2. rcp(插件开发)插件B需要引用插件A中的jar包-如何处理依赖关系
  3. 《爱情公寓2》将播 恶搞宣传片大喊“有种别看”
  4. 利用歌词插件 让WMP活起来
  5. C进阶 - 内存四驱模型
  6. oracle中的exists 和 not exists 用法详解
  7. 【No.5 类型转换导致的错误】
  8. 大数据系列6:HBase – 基于Hadoop的分布式数据库
  9. 获取线程中抛出的异常信息
  10. 【Java笔记】C++与Java的对比