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程序的所有权结构。正常使用它的方法是这样的:

<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);
}

效果图:

Qt之QTimer

注:

    技术在于交流、沟通,转载请注明出处并保持作品的完整性。

    作者:╰☆奋斗ing❤孩子`  原文:http://blog.sina.com.cn/s/blog_a6fb6cc90101drq0.html

猜你喜欢

转载自blog.csdn.net/gaoxiaochuan89/article/details/82714282
今日推荐