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内容请搜索靠谱客的其他文章。
发表评论 取消回复