概述
1.基础说明
QTimer类提供了重复的、一次性的计时器。
QTimer类为计时器提供了一个高级编程接口。要使用它,创建一个QTimer,将其timeout()信号连接到适当的插槽,并调用start()。从那时起,它将以恒定的间隔发出timeout()信号。
1秒(1000毫秒)定时器的示例(来自模拟时钟示例):
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
从那时起,每秒钟都会调用update()槽。
您可以通过调用setSingleShot(true)将计时器设置为只超时一次。你也可以使用静态的QTimer::singleShot()函数在指定的时间间隔后调用插槽:
QTimer::singleShot(200, this, SLOT(updateCaption()));
在多线程应用程序中,您可以在任何具有事件循环的线程中使用QTimer。要从非gui线程启动事件循环,请使用QThread::exec()。Qt使用计时器的线程关联来确定哪个线程将发出timeout()信号。因此,您必须在其线程中启动和停止计时器;从其他线程启动计时器是不可能的。
作为一种特殊情况,超时为0的QTimer将在窗口系统事件队列中的所有事件被处理后立即超时。这可以用来做繁重的工作,同时提供一个漂亮的用户界面:
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(processOneThing()));
timer->start();
从那时起,processOneThing()将被反复调用。它应该以这样一种方式编写,即它总是快速返回(通常在处理一个数据项之后),以便Qt可以向用户界面交付事件,并在完成所有工作后立即停止计时器。这是在GUI应用程序中实现繁重工作的传统方法,但随着多线程现在在越来越多的平台上可用,我们预计零毫秒QTimer对象将逐渐被qthread取代。
2.精度和定时器分辨率
计时器的准确性取决于底层操作系统和硬件。大多数平台支持1毫秒的分辨率,尽管在许多实际情况下定时器的精度不等于这个分辨率。
精确度还取决于定时器类型。对于Qt::PreciseTimer, QTimer将试图保持精度在1毫秒。精确计时器也永远不会超时早于预期。
对于Qt::CoarseTimer和Qt::VeryCoarseTimer类型,QTimer可能会比预期的更早醒来,在这两种类型的边界内:Qt::CoarseTimer的间隔的5%,Qt::VeryCoarseTimer的间隔为500毫秒。
如果系统繁忙或无法提供所要求的准确性,所有计时器类型都可能超时,比预期的时间晚。在这种超时溢出的情况下,即使多个超时已经过期,Qt也只会发出一次activated(),然后将恢复原来的间隔。
3.替代QTimer
使用QTimer的一个替代方法是为对象调用QObject::startTimer(),并在类中重新实现QObject::timerEvent()事件处理程序(该类必须继承QObject)。缺点是timerEvent()不支持单次定时器或信号等高级特性。
另一种选择是QBasicTimer。它通常没有直接使用QObject::startTimer()那么麻烦。有关这三种方法的概述,请参阅Timers。
一些操作系统限制可能使用的计时器的数量;Qt试图绕过这些限制。
参见QBasicTimer, QTimerEvent, QObject::timerEvent(), Timers,模拟时钟示例,和Wiggly示例。
最后
以上就是大气小兔子为你收集整理的QT定时器1.基础说明3.替代QTimer的全部内容,希望文章能够帮你解决QT定时器1.基础说明3.替代QTimer所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复