简述

QObject是所有Qt objects的基类,在Qt中提供了基础定时器的支持。使用QObject::startTimer(),你可以传递一个毫秒数间隔作为参数启动一个定时器。该函数返回一个唯一的整数timer ID,计时器会定时触发,直到你显式地传递timer ID调用QObject::killTimer()。

对于这种工作机制,应用程序必须在事件循环(event loop)中运行,使用QApplication::exec()启动一个事件循环。当一个定时器触发时,应用程序会发送一个QTimerEvent,并且控制流离开事件循环,直到定时器事件被处理。这意味着,当你的应用程序正忙着做别的事情时,定时器不能触发。换句话说,计时器的精度取决于应用程序的粒度。

在多线程应用程序中,你可以在有一个事件循环的任何线程中使用定时器机制。要从一个非GUI线程启动事件循环,使用QThread::exec()。Qt使用对象的线程关联来确定哪个线程将传送QTimerEvent。正因如此,你必须启动和停止该对象的线程的所有计时器,不可能在另一个线程的对象中启动定时器。

详细说明

主要的计时器功能API在QTimer中,这个类提供了常规的定时器。当定时器触发就会发射信号,而继承自QObject以便适合大多数GUI程序的所有权结构。正常使用它的方法是这样的:

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateCaption()));
timer->start(1000);

QTimer对象作为这个部件的孩子,当此部件被删除时,计时器也被删除。接下来,连接timeout()信号与槽函数,以1000毫秒的间隔启动定时器,表明它将每秒钟都会超时。

QTimer还为单次触发定时器提供了一个静态函数。例如:

QTimer::singleShot(200, this, SLOT(updateCaption()));

在这行代码执行后200毫秒(0.2秒),updateCaption()槽将被调用。

为了让QTimer可以运行,你必须在应用程序中有一个事件循环;也就是说,你必须在某个地方调用QCoreApplication::exec(),定时器事件只在事件循环运行时被传送。

在多线程应用程序中,你可以在有一个事件循环的任何线程中使用QTimer。要从一个非GUI线程启动事件循环,使用QThread::exec()。Qt使用定时器的 thread affinity来确定哪个线程将发射timeout()信号。正因如此,你必须启动和停止计时器在它自己的线程中,不可能在另一个线程的对象中启动定时器。

Analog Clock(模拟时钟)示例说明了如何使用QTimer定期重绘一个部件。AnalogClock的实现:

AnalogClock::AnalogClock(QWidget *parent)
: QWidget(parent)
{
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
...
}

每一秒钟,QTimer就会调用QWidget::update()槽函数刷新时钟的显示。

如果你已经有了一个QObject子类,并希望有一个简单的优化,可以使用QBasicTimer代替QTimer。使用QBasicTimer,必须在你的QObject子类中重写timerEvent()并且处理超时。Wiggly示例说明如何使用QBasicTimer。

更多参考

Qt之Timers的更多相关文章

  1. 《Qt 实战一二三》

    简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的 ...

  2. QObject::startTimer: timers cannot be started from another thread 一则输出调试:关于QT的线程关联性

    开始 今天在调试输出里看见QObject::startTimer: timers cannot be started from another thread QTimer类 从Qt的帮助文档里可以得到 ...

  3. Qt事件处理机制

    研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多.后来由于项目的需要,也没有再接触Qt了.现在要重新拾起来,于是要从基础学起. Now,开始学习Qt事件处理机制. 先给出原文 ...

  4. Qt 控制watchdog app hacking

    /************************************************************************** * Qt 控制watchdog app hack ...

  5. Qt源码分析之QObject

    原文:http://blog.csdn.net/oowgsoo/article/details/1529284 我感觉oowgsoo兄弟写的分析相当透彻,赞! 1.试验代码: #include < ...

  6. Qt源码分析之QPointer

    QPointer是一个指针封装类,其作用类似于智能指针,但是它最大的特点应该是在指针的控制上,它希望一个Qt的指针(当然是从QObject派生的)可以同时被多个类拥有,这在界面编程中当然是很常见的事情 ...

  7. 剖析Qt的事件机制原理

    版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消息循环和WinMai ...

  8. Qt经典—线程、事件与Qobject(耳目一新)

    介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...

  9. 转:QT 的点点滴滴 错误总结

    转自:http://blog.csdn.net/lbsljn/archive/2009/12/29/5099590.aspx MinGw + CodeBlock + QT4.5 类定义后面要加&quo ...

随机推荐

  1. 【leetcode❤python】 290. Word Pattern

    #-*- coding: UTF-8 -*-class Solution(object):    def wordPattern(self, pattern, str):        "& ...

  2. GBrowse配置相关资料

    GBrowse配置相关资料(形状.颜色.配置.gff3) http://gmod.org/wiki/Glyphs_and_Glyph_Optionshttp://gmod.org/wiki/GBrow ...

  3. 【转】The decoupling capacitor…is it really necessary?

    Before working as an applications engineer, I worked as an IC test development engineer here at TI. ...

  4. FLASH CC 2015 CANVAS (二)html中写JS调用flash中的元件、函数、变量

    注意 此贴 为个人边“开荒”边写,所以不保证就是最佳做法,也难免有错误! 正式教程会在后续开始更新 当你导出第一个canvas后,你会在保存fla的文件夹里 (每个项目默认位置)看到 如下文件,(请先 ...

  5. 写XML配置文件时的一个乱码问题

    首先我们用文本文档写一个xml文件如下: <?xml version="1.0" encoding="gb2312"?> <a> < ...

  6. 初识Oracle

    登录时无法登陆:   无监听程序 ———>启动服务OracleXETNListener   监听程序当前无法识别连接描述中的请求服务————>重启服务       OracleServic ...

  7. iOS - OC NSFileManager 文件管理

    前言 @interface NSFileManager : NSObject @interface NSFileHandle : NSObject <NSSecureCoding> NSF ...

  8. linux设备驱动编写_tasklet机制(转)

    在编写设备驱动时, tasklet 机制是一种比较常见的机制,通常用于减少中断处理的时间,将本应该是在中断服务程序中完成的任务转化成软中断完成. 为了最大程度的避免中断处理时间过长而导致中断丢失,有时 ...

  9. linux 通过 ulimit 改善系统性能

    https://www.ibm.com/developerworks/cn/linux/l-cn-ulimit/ 概述 系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何 ...

  10. Linux系统/etc/init.d目录

    理解Linux系统/etc/init.d目录和/etc/rc.local脚本 http://blog.csdn.net/acs713/article/details/7322082 Linux文件目录 ...