简述
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程序的所有权结构。正常使用它的方法是这样的:
<span style="color:#000000"><code class="language-Qt">QTimer *<span style="color:#4f4f4f">timer</span> = <span style="color:#000088">new</span> QTimer(this);
connect(<span style="color:#4f4f4f">timer</span>, SIGNAL(timeout()), this, SLOT(updateCaption()));
<span style="color:#4f4f4f">timer</span>->start(<span style="color:#006666">1000</span>);</code></span>
- 1
- 2
- 3
QTimer对象作为这个部件的孩子,当此部件被删除时,计时器也被删除。接下来,连接timeout()信号与槽函数,以1000毫秒的间隔启动定时器,表明它将每秒钟都会超时。
QTimer还为单次触发定时器提供了一个静态函数。例如:
<span style="color:#000000"><code class="language-Qt">QTimer::singleShot(<span style="color:#006666">200</span>, <span style="color:#000088">this</span>, SLOT(updateCaption()));</code></span>
- 1
在这行代码执行后200毫秒(0.2秒),updateCaption()槽将被调用。
为了让QTimer可以运行,你必须在应用程序中有一个事件循环;也就是说,你必须在某个地方调用QCoreApplication::exec(),定时器事件只在事件循环运行时被传送。
在多线程应用程序中,你可以在有一个事件循环的任何线程中使用QTimer。要从一个非GUI线程启动事件循环,使用QThread::exec()。Qt使用定时器的 thread affinity来确定哪个线程将发射timeout()信号。正因如此,你必须启动和停止计时器在它自己的线程中,不可能在另一个线程的对象中启动定时器。
Analog Clock(模拟时钟)示例说明了如何使用QTimer定期重绘一个部件。AnalogClock的实现:
<span style="color:#000000"><code class="language-Qt">AnalogClock::AnalogClock(QWidget *parent)
: QWidget(parent)
{
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(<span style="color:#006666">1000</span>);
<span style="color:#000088">...</span>
}</code></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
每一秒钟,QTimer就会调用QWidget::update()槽函数刷新时钟的显示。
如果你已经有了一个QObject子类,并希望有一个简单的优化,可以使用QBasicTimer代替QTimer。使用QBasicTimer,必须在你的QObject子类中重写timerEvent()并且处理超时。Wiggly示例说明如何使用QBasicTimer。
更多参考
以上转自大神博客:https://blog.csdn.net/liang19890820/article/details/52062832
在Qt开发界面的时候,非常多的时候都得使用定时器,定时器具体可以干什么呢?比如:控制时钟、定时改变样式、改变进度等。。。说到这里,经常使用QQ,而不同的时段都会显示不同的背景,我认为如果用Qt实现的话,就得使用QTimer定时的获取时间,判断当前时间为morning、noon、afternoon、night来改变当前的背景。。。
虽然QTimer简单易用,但是比较耗内存,所以在不必要的时候就必须终止它。。。
QTimer构造:
QTimer *timer = new QTimer();
QTimer设置超时并启动:
timer->setInterval(1000);
timer->start();
或:timer->start(1000);
QTimer改变定时间隔为msec毫秒
timer->changeInterval(msec);
如果这个定时器信号是运行的,它将会被停止并且重新开始,否则它将会被开始。
QTimer是否则正在运行
timer->isActive()
如果定时器正在运行,返回真,否则返回假。
QTimer停止
timer->stop();
当达到超时时间,则发射信号,执行指定的槽函数
connect(timer, SIGNAL(timeout()), this, SLOT(myTimeout()));
以下是利用QTimer来控制一个进度条,超时时间为1000毫秒(1秒),当达到超时时间时,进度条增加1%,当进度条为100%时,停止Qtimer。
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent)
{
this->setFixedSize(400, 300);
progress_value = 0;
timer = new QTimer();
timer->setInterval(1000);
timer->start();
progress_bar = new QProgressBar(this);
progress_bar->setGeometry(50, 50, 150, 20);
progress_bar->setValue(0);
connect(timer, SIGNAL(timeout()), this, SLOT(changeValue()));
}
void MyWidget::changeValue()
{
progress_value++;
if(progress_value > 100)
{
timer->stop();
}
progress_bar->setValue(progress_value);
}
效果图:
注:
技术在于交流、沟通,转载请注明出处并保持作品的完整性。
作者:╰☆奋斗ing❤孩子` 原文:http://blog.sina.com.cn/s/blog_a6fb6cc90101drq0.html。