Qt之Timers
简述
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。
更多参考
- Timers - 助手
- Qt之模拟时钟
Qt之Timers的更多相关文章
- 《Qt 实战一二三》
简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的 ...
- QObject::startTimer: timers cannot be started from another thread 一则输出调试:关于QT的线程关联性
开始 今天在调试输出里看见QObject::startTimer: timers cannot be started from another thread QTimer类 从Qt的帮助文档里可以得到 ...
- Qt事件处理机制
研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多.后来由于项目的需要,也没有再接触Qt了.现在要重新拾起来,于是要从基础学起. Now,开始学习Qt事件处理机制. 先给出原文 ...
- Qt 控制watchdog app hacking
/************************************************************************** * Qt 控制watchdog app hack ...
- Qt源码分析之QObject
原文:http://blog.csdn.net/oowgsoo/article/details/1529284 我感觉oowgsoo兄弟写的分析相当透彻,赞! 1.试验代码: #include < ...
- Qt源码分析之QPointer
QPointer是一个指针封装类,其作用类似于智能指针,但是它最大的特点应该是在指针的控制上,它希望一个Qt的指针(当然是从QObject派生的)可以同时被多个类拥有,这在界面编程中当然是很常见的事情 ...
- 剖析Qt的事件机制原理
版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消息循环和WinMai ...
- Qt经典—线程、事件与Qobject(耳目一新)
介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...
- 转:QT 的点点滴滴 错误总结
转自:http://blog.csdn.net/lbsljn/archive/2009/12/29/5099590.aspx MinGw + CodeBlock + QT4.5 类定义后面要加&quo ...
随机推荐
- HTML Meta中添加X-UA-Compatible和IE=Edge,chrome=1有什么作用?
X-UA-Compatible是自从IE8新加的一个设置,对于IE8以下的浏览器是不识别的.通过在meta中设置X-UA-Compatible的值,可以指定网页的兼容性模式设置. 在网页中指定的模式优 ...
- 蒙特卡洛法计算定积分—Importance Sampling
如上图所示,计算区间[a b]上f(x)的积分即求曲线与X轴围成红色区域的面积.下面使用蒙特卡洛法计算区间[2 3]上的定积分:∫(x2+4*x*sin(x))dx # -*- coding: u ...
- Django1.9 Python3.4出现Error loading MySQLdb
linux Errorloading MySQLdb module: No module named MySQLdb 这是因为目前 MySQLdb 还不支持 python3.x ,开源无人维护哈 之前 ...
- [SAP ABAP开发技术总结]BAPI调用
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- CUBRID学习笔记 21 查看主键外键索引
命令 show create table game; game是表名 在web管理中,请在sql标签中查,不要在query中执行. show create table game; === <Re ...
- ServiceStack.OrmLite 笔记5 改
修改 db.Update(new Person { Id = 1, FirstName = "Jimi", LastName = "Hendrix", Age ...
- So easy Webservice 4.Java方式访问WebService(使用jdk1.6以上 wsimport命令)
1.选中要调用的服务单击”服务说明” 2.获取wsdl文件.使用JDK1.6以上的版本的wsimport命令 a) 例如选中:http://webservice.webxml.com.cn/WebSe ...
- html中出现的script失效
如果在Controller中出现script代码类似 $hello_str='Hello God<script>alert(3);</script>'; 那么我不希望在传给vi ...
- 这只是一篇用Markdown写的随记,就是熟悉熟悉MarkDown而已
这几天的随想 今天是八月十一号了,来到公司实习已经第八天了,包块周末的话就是十二天了,我在这十二天里干了什么,转眼半个月就过去了 马上就要开学了,这个暑假干了些什么,单词单词也没背多少,之前七月回家有 ...
- iOS - UIActionSheet
前言 NS_CLASS_DEPRECATED_IOS(2_0, 8_3, "UIActionSheet is deprecated. Use UIAlertController with a ...