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

■、QObject类的定时器QObject是所有Qt对象的基类,它提供了一个基本的定时器。通过QObject::startTimer(),可以把一个一毫秒为单位的时间间隔作为参数来开始定时器,这个函数返回一个唯一的整数定时器的标识符。这个定时器开始就会在每一个时间间隔"触发",直到明确的使用这个定时器的标识符来调用QObject::killTimer()结束。当定时器触发时,应用程序会发送一个QTimerEvent。在事件循环中,处理器按照事件队列的顺序来处理定时器事件。当处理器正忙于其它事件处理时,定时器就不能立即处理。QObject类还提供定时期的功能。与定时器相关的成员函数有:startTimer()、timeEvent()、killTimer()。

QObject基类中的startTimer()和timerEvent()原型及说明如下:

int QObject::startTimer(int interval);

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

virtual void QObject::timerEvent(QTimerEvent *event);

虚函数timerEvent()被重载来实现用户的超时事件处理函数。如果有多个定时器在运行,QTimerEvent::timerId()被用来查找指定定时器,对其进行操作。当定时器事件发生时,虚函数timerEvent()随着QTimerEvent事件参数类一起被调用,重载这个函数可以获得定时器事件。

定时器的用法如下:

//头文件class QNewObject : public QObject{Q_OBJECTpublic: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);}

void QNewObject::timerEvent( QTimerEvent *event ){qDebug( "timer event, id %d", event->timerId() );}

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

//创建定时器QTimer *testTimer = new QTimer(this);//将定时器超时信号与槽(功能函数)联系起来connect( testTimer, SIGNAL(timeout()), this, SLOT(testFunction()) );//开始运行定时器,定时时间间隔为1000mstestTimer->start(1000);...//停止运行定时器if ( testTimer->isActive() )testTimer->stop();//此种方法若不停止定时器,則超时事件每1000ms触发一次

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

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

第二种介绍:

定时器的使用非常简单,我们只需要以下几个步骤就可以完成定时器的应用:1.产生一个定时器QTimer *time_clock=new QTimer(parent);2.连接这个定时器的信号和槽,利用定时器的timeout()connect(time_clock,SIGNAL(timeout()),this,SLOT(slottimedone()));即定时时间到就会发送timeout()信号,从而触发slottimedone()槽去完成某项事情3.开始定时器,并设定定时周期定时器定时有两种:start(int time)和setSingleShot(true)其中start(int time)是表示每隔time秒就会重启定时器,可以重复触发定时,除非你利用stop()将定时器关掉。而setSingleShot(true)则是仅仅启动定时器一次我们工程中常用的是前者。time_clock->start(2000);备注:我在中文的官网上找到的关于定时器的用法是如下的使用格式:QTimer *timer = new QTimer( myObject );connect( timer, SIGNAL(timeout()), myObject, SLOT(timerDone()) );timer->start( 2000, TRUE ); // 2秒单触发定时器关于最后一句,timer->start( 2000, TRUE );在我实际应用中,加上TRUE编译器就会报错,不知道为什么,去掉就没有关系了。这个问题遗留下来,或许以后可以解决掉

Qt计时器的更多相关文章

  1. qt 计时器自动刷新图片

    计时器 QTimer *timer; timer->start (); void PictureShow::stopStartPage() { if (timer->isActive()) ...

  2. 【QT】计时器制作

    应小伙伴的要求,做一个小计时器.功能是点击开始就从00:00:00开始计时,点击暂停就暂停计时,点击停止就停止计时. 界面如上图,使用ui设计师直接拖的.按钮和图标的图片都是网上下载的.用美图秀秀抠成 ...

  3. Qt Quick鼠标事件处理、键盘、计时器

    在<Qt Quick 事件处理之信号与槽>中介绍了 QML 中怎样使用内建类型的信号以及怎样自己定义信号,这次我们来看看怎样处理鼠标.键盘.定时器等事件.这些时间在处理时,一般是通过信号来 ...

  4. QT建立简单的计时器程序

    1.创建一个窗口项目 2.拖一个lcd控件命名lcdNumber,两个pushbutton,分别命名pbStart与pbEnd 3.mainWindow.h添加以下代码 private slots: ...

  5. qt QTimer 计时器

    #include <QtCore> #include <QTimer> QTimer *timer; timer = new QTimer(this); connect(tim ...

  6. Qt: 时钟Demo

    其实是一个很简单的Demo,可以编译了拿NSIS打包.最近在做富文本编辑器和补C++不记得的东西吧,项目遥遥无期. //clock.pro #----------------------------- ...

  7. Qt timer学习

    QTimer(重复和单发计时器) 应用QTimer时,先创建一个QTimer类,利用connect将timeout()与对应槽函数连接,在调用start()函数设置定时器时间间隔,每经过设置时间后,定 ...

  8. Qt使用一个事件队列对所有发出的事件进行维护(QObject的event()函数相当于dispatch函数),用EventLabel 继承QLabel作为例子(简单明了) good

    事件(event)是由系统或者 Qt 本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键盘事件等:另一些事 ...

  9. Qt之Timers

    简述 QObject是所有Qt objects的基类,在Qt中提供了基础定时器的支持.使用QObject::startTimer(),你可以传递一个毫秒数间隔作为参数启动一个定时器.该函数返回一个唯一 ...

随机推荐

  1. Python pyQt4/pyQt5 学习笔记1(空白窗口,按钮,控件事件,控件提示,窗体显示到屏幕中间,messagebox)

    PyQt4是用来编写有图形界面程序(GUI applications)的一个工具包.PyQt4作为一个Python模块来使用,它有440个类和超过6000种函数和方法.同时它也是一个可以在几乎所有主流 ...

  2. Elasticsearch 学习之 Marvel概念

    概要 含义如下: 搜索速率:对于单个索引,它是每秒查找次数*分片数.对于多个索引,它是每个索引的搜索速率的总和. 搜索延迟:每个分片中的平均延迟. 索引速率:对于单个索引,它是每秒索引的数量*分片数量 ...

  3. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十三:串口模块② — 接收

    实验十三:串口模块② - 接收 我们在实验十二实现了串口发送,然而这章实验则要实现串口接收 ... 在此,笔者也会使用其它思路实现串口接收. 图13.1 模块之间的数据传输. 假设我们不考虑波特率,而 ...

  4. 2-3 vue配置介绍

    一.通过vue-cli构建的项目的文件介绍 1.bulid文件夹 ==> 项目打包的配置文件夹 2.config文件夹 ==> 打包的配置 3.src文件夹 ==> 项目开发的源码 ...

  5. linux定时任务cron配置说明

    实现linux定时任务有:cron.anacron.at,使用最多的是cron任务 名词解释 cron--服务名:crond--linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与 ...

  6. nginx动静分离小示例

    server { listen ; server_name www.xxx.cn; #静态页面 #匹配首页,url:www.xxx.cn index index.html; root /usr/loc ...

  7. Linux查看磁盘目录内存空间使用情况

    du 显示每个文件和目录的磁盘使用空间 命令参数 -c或--total  除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和. -s或--summarize  仅显示总计,只列出最后加总的 ...

  8. Python开发环境搭建方法简述

    先插入一条广告,博主新开了一家淘宝店,经营自己纯手工做的发饰,新店开业,只为信誉!需要的亲们可以光顾一下!谢谢大家的支持!店名: 小鱼尼莫手工饰品店经营: 发饰.头花.发夹.耳环等(手工制作)网店: ...

  9. Bagging和Boosting的概念与区别

    随机森林属于集成学习(ensemble learning)中的bagging算法,在集成算法中主要分为bagging算法与boosting算法, Bagging算法(套袋发) bagging的算法过程 ...

  10. HDU 4578 - Transformation - [加强版线段树]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 Problem Description Yuanfang is puzzled with the ...