概述
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:计时器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复