警告

本节包含从C++自动翻译成Python的代码片段,可能会导致错误。

定时器#

如何在您的应用程序中使用Qt定时器。

QObject, 所有Qt对象的基础类,提供了Qt的定时器支持。通过 startTimer() 方法,您可以使用以毫秒为间隔的参数启动定时器。该函数返回一个唯一的整数定时器ID。定时器将现在以规律的时间间隔触发,直到您显式地调用 killTimer() 方法并传入定时器ID来停止定时器。

为了使此机制正常工作,应用程序必须在事件循环中运行。您使用 QApplication::exec() 启动事件循环。当一个定时器触发时,应用程序发送一个 QTimerEvent ,然后控制流离开事件循环,直到处理定时器事件。这意味着定时器无法在您的应用程序忙于做其他事情时触发。换而言之:定时器的准确性取决于应用程序的粒度。

在多线程应用程序中,您可以在任何具有事件循环的线程中使用定时器机制。要从非GUI线程启动事件循环,请使用 exec() 方法。Qt使用对象的 thread affinity 属性来确定哪个线程将传递 QTimerEvent 。因此,您必须在对象的线程中启动和停止所有定时器;不能为其他线程中的对象启动定时器。

间隔值的上限由可指定在有符号整数中的毫秒数确定(实际上,这是一个大约24天多的周期)。准确性取决于底层操作系统。Windows 2000有15毫秒的精度;其他我们已经测试过的系统可以处理1毫秒的间隔。

定时功能的主要API是 QTimer 。该类提供周期性定时器,当定时器触发时发出信号,并继承自 QObject ,因此非常适合大多数Qt程序的所有权结构。其正常使用方式如下

timer = QTimer(self)
timer.timeout.connect(self.updateCaption)
timer.start(1000)

QTimer 对象设置为 this 对象的子对象,这样当 this 对象被删除时,定时器也会被删除。接下来,将其 timeout() 信号连接到将执行工作的槽,启动时设置为1000毫秒,这意味着它将每秒超时一次。

QTimer 还提供了一个用于单次定时器的静态函数。例如

QTimer::singleShot(200, self.updateCaption)

在这行代码执行200毫秒(0.2秒)后,将调用 updateCaption() 槽。

要使 QTimer 工作,你的应用程序必须有一个事件循环;也就是说,你必须某处调用 exec() 。仅当事件循环正在运行时,才会传递定时器事件。

在多线程应用程序中,你可以在任何拥有事件循环的线程中使用 QTimer 。要从非GUI线程启动事件循环,使用 exec() 。Qt使用定时器的 thread affinity 确定哪个线程将发出 timeout() 信号。因此,你必须在其线程中启动和停止定时器;无法从另一个线程启动定时器。

模拟时钟示例展示了如何使用 QTimer 在固定时间间隔重绘小部件。从 AnalogClock 的实现

def __init__(self, parent):
super().__init__(parent)
timer = QTimer(self)
timer.timeout.connect(this, QOverload<>::of(&AnalogClock::update))
timer.start(1000)            ...

每秒,QTimer 将调用 QWidget::update() 槽来刷新时钟的显示。

如果您已经有一个 QObject 子类,并希望进行简单的优化,您可以使用 QBasicTimer 而不是 QTimer . 使用 QBasicTimer 时,您必须在您的 QObject 子类中重新实现 timerEvent() 方法并在那里处理超时。