我是靠谱客的博主 辛勤发箍,最近开发中收集的这篇文章主要介绍Qt:计时器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

QObject是所有Qt对象的基类,它提供Qt中的基本定时器支持。使用QObject :: startTimer(),您可以以毫秒为参数启动计时器,函数返回唯一的整数计时器ID。计时器现在将定期触发,直到您显式调用具有计时器ID的QObject::killTimer()

要使此机制工作,应用程序必须在事件循环中运行。您可以使用QApplication::exec()启动事件循环。当计时器触发时,应用程序发送一个QTimerEvent,并且控制流离开事件循环,直到处理计时器事件。这意味着当应用程序忙于做其他事情时,计时器无法触发。换句话说:计时器的准确性取决于应用程序的粒度。

在多线程应用程序中,可以在任何具有事件循环的线程中使用计时器机制。要从非GUI线程启动事件循环,请使用QThread::exec()。Qt使用对象的线程关联性来确定哪个线程将传递QTimerEvent。因此,您必须在其线程中启动和停止计时器。无法从另一个线程启动计时器。

间隔值的上限由可在带符号整数中指定的毫秒数确定(实际上,这是一个仅超过24天的时间段)。准确度取决于底层操作系统。Windows2000有15毫秒的精度;我们测试过的其他系统可以处理1毫秒的间隔。

计时器功能的主要API是QTimer。该类提供了定时计时器,当计时器触发时发出信号,并继承QObject,以便它很好地适应大多数Qt程序的所有权结构。正常的使用方式是这样的:

    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &Foo::updateCaption);
    timer->start(1000);

QTimer对象被制作成这个对象的子对象,这样,当这个对象被删除时,计时器也被删除。接下来,它的·timeout()·信号被连接到将要工作的插槽,它以1000毫秒的值开始,表示它将每秒超时一次。

QTimer还为单次计时器提供了静态功能。比如:

  QTimer::singleShot(200, this, &Foo::updateCaption);

执行此代码行后的200毫秒(0.2秒),该updateCaption()插槽将被调用

为了使QTimer正常工作,您的应用程序中必须有一个事件循环。也就是说,您必须在某个地方调用QCoreApplication :: exec()。仅在事件循环运行时才传递计时器事件。

模拟时钟示例演示了如何使用QTimer以定时重新绘制小部件。从模拟时钟的实现来看:

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

QTimer每秒都会调用QWidget :: update()插槽刷新时钟的显示。

如果您已经有了QObject子类并希望进行简单的优化,则可以使用·、QBasicTimer而不是QTimer。使用QBasicTimer,您必须在QObject子类中重新实现timerEvent()并在那里处理超时。该威格利例子展示了如何使用QBasicTimer。

最后

以上就是辛勤发箍为你收集整理的Qt:计时器的全部内容,希望文章能够帮你解决Qt:计时器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部