PySide6.QtCore.QTimer

class QTimer

QTimer 类提供了重复和单次的计时器。更多

PySide6.QtCore.QTimer 的继承图

概要

属性

方法

插槽

信号

静态函数

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。

详细描述

警告

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

QTimer 类为定时器提供了一个高级编程接口。要使用它,创建一个 QTimer,将其 timeout() 信号连接到适当的槽,并调用 start()。从那时起,它将以固定的时间间隔发出 timeout() 信号。

一秒(1000毫秒)计时器的示例(来自模拟时钟示例):

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

从那时起,update() 槽每秒被调用一次。

你可以通过调用setSingleShot (true)来设置一个只触发一次的定时器。你也可以使用静态函数singleShot()在指定的时间间隔后调用一个槽:

QTimer::singleShot(200, self.updateCaption)

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

作为一种特殊情况,超时时间为0的QTimer将尽可能快地超时,尽管零定时器与其他事件源之间的顺序未指定。零定时器可用于在执行某些工作的同时仍然提供快速的用户界面:

timer = QTimer(self)
timer.timeout.connect(self.processOneThing)
timer.start()

从那时起,processOneThing() 将被重复调用。它应该以快速返回的方式编写(通常在处理一个数据项后),以便 Qt 可以向用户界面传递事件,并在完成所有工作后立即停止计时器。这是在 GUI 应用程序中实现繁重工作的传统方式,但随着多线程在越来越多的平台上变得可用,我们预计零毫秒的 QTimer 对象将逐渐被 QThread 取代。

准确性和计时器分辨率

定时器的准确性取决于底层操作系统和硬件。大多数平台支持1毫秒的分辨率,尽管在许多实际情况下,定时器的准确性不会达到这个分辨率。

准确性还取决于timer type。对于PreciseTimerQTimer将尝试将准确性保持在1毫秒。精确计时器也不会比预期提前超时。

对于CoarseTimerVeryCoarseTimer类型,QTimer可能会比预期提前唤醒,在这些类型的误差范围内:CoarseTimer的误差为间隔的5%,而VeryCoarseTimer的误差为500毫秒。

如果系统繁忙或无法提供所需的精度,所有计时器类型可能会比预期更晚超时。在这种情况下,即使多个超时已过期,Qt 也只会发出一次 timeout(),然后恢复原始间隔。

QTimer的替代方案

Qt 6.8 引入了 QChronoTimer。这两个类之间的主要区别是,QChronoTimer 支持更大的时间间隔范围和更高的精度(std::chrono::nanoseconds)。对于 QTimer,支持的最大时间间隔是 ±24 天,而对于 QChronoTimer,它是 ±292 年(在时间间隔超过 std::numeric_limits::max() 时,整数溢出的可能性更小)。如果你只需要毫秒级的分辨率和 ±24 天的时间范围,你可以继续使用 QTimer

另一个替代方案是在你的类中重新实现timerEvent()方法(该类必须是QObject的子类),并使用以下方法之一:

  • 使用QBasicTimer,这是一个轻量级的包装计时器ID的值类。你可以使用QBasicTimer::start()启动计时器,并使用stop()停止它。你可以在重新实现的timerEvent()中处理事件。

  • 一种更低级别的方法是直接操作计时器ID。要启动计时器,调用startTimer(),并存储返回的ID。要停止计时器,调用killTimer()。您可以在重新实现的timerEvent()中处理事件。这种方法通常比使用QBasicTimer更繁琐。

使用timerEvent()的一个缺点是,一些高级功能,如单次定时器和信号,不受支持。

一些操作系统限制了可以使用的计时器数量;Qt 试图绕过这些限制。

另请参阅

QBasicTimer QTimerEvent timerEvent() Timers Analog Clock

注意

当使用from __feature__ import true_property时,属性可以直接使用,否则通过访问器函数使用。

property activeᅟ: bool

如果计时器正在运行,则此布尔属性为 true;否则为 false。

Access functions:
property intervalᅟ: int

此属性保存超时间隔,单位为毫秒。

此属性的默认值为0。一个超时间隔为0的QTimer将在窗口系统事件队列中的所有事件处理完毕后立即超时。

设置正在运行的计时器的间隔将更改间隔,stop() 然后 start() 计时器,并获取一个新的 id()。如果计时器没有运行,则只更改间隔。

另请参阅

singleShot

Access functions:
property remainingTimeᅟ: int

此属性保存剩余的毫秒数。

返回计时器剩余的毫秒数,直到超时。如果计时器未激活,返回值将为-1。如果计时器已超时,返回值将为0。

另请参阅

interval

Access functions:
property singleShotᅟ: bool

此属性表示计时器是否为单次计时器。

单次计时器只触发一次,非单次计时器每隔interval毫秒触发一次。

此属性的默认值为false

另请参阅

interval singleShot()

Access functions:
property timerTypeᅟ: Qt.TimerType

此属性控制计时器的准确性。

此属性的默认值为 Qt::CoarseTimer

另请参阅

TimerType

Access functions:
__init__([parent=None])
Parameters:

父对象QObject

使用给定的parent构造一个计时器。

id()
Return type:

TimerId

如果计时器正在运行,则返回表示计时器ID的TimerId;否则返回Qt::TimerId::Invalid

另请参阅

TimerId

interval()
Return type:

整数

另请参阅

setInterval()

属性 intervalᅟ 的获取器。

isActive()
Return type:

布尔

如果计时器正在运行,则返回true;否则返回false

属性 activeᅟ 的获取器。

isSingleShot()
Return type:

布尔

属性 singleShotᅟ 的获取器。

remainingTime()
Return type:

整数

属性 remainingTimeᅟ 的获取器。

setInterval(msec)
Parameters:

毫秒 – 整数

另请参阅

interval()

属性 intervalᅟ 的设置器。

setSingleShot(singleShot)
Parameters:

singleShot – 布尔值

另请参阅

singleShot()

属性 singleShotᅟ 的设置器。

setTimerType(atype)
Parameters:

atypeTimerType

另请参阅

timerType()

属性 timerTypeᅟ 的设置器。

static singleShot(msec, functor)
Parameters:
  • msec – int

  • 函子PyCallable

static singleShot(msec, context, functor)
Parameters:
  • msec – int

  • contextQObject

  • 函子PyCallable

static singleShot(msec, receiver, member)
Parameters:
  • msec – int

  • receiverQObject

  • member – str

警告

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

使用chrono重载。这个静态函数在给定的时间间隔后调用一个槽。

使用此函数非常方便,因为您不需要处理timerEvent或创建本地的QTimer对象。

示例:

from PySide6.QtWidgets import QApplication
from PySide6.QtCore import QTimer
if __name__ == "__main__":

    app = QApplication([])
    QTimer.singleShot(600000, app, QCoreApplication.quit)
    ...
    sys.exit(app.exec())

此示例程序在10分钟后(600,000毫秒)自动终止。

receiver 是接收对象,member 是插槽。时间间隔为 msec 毫秒。

另请参阅

start()

static singleShot(msec, timerType, receiver, member)
Parameters:

这是一个重载函数。

使用chrono重载。这个静态函数在给定的时间间隔后调用一个槽。

使用此函数非常方便,因为您不需要费心处理timerEvent或创建本地的QTimer对象。

receiver 是接收对象,member 是插槽。时间间隔为 msec 毫秒。timerType 影响计时器的准确性。

另请参阅

start()

start()

此函数重载了start()。

使用interval中指定的超时时间启动或重新启动计时器。

如果计时器已经在运行,它将被停止并重新启动。这也会改变它的id()

如果 singleShot 为 true,计时器将仅激活一次。

start(msec)
Parameters:

毫秒 – 整数

msec毫秒的超时间隔启动或重新启动计时器。

如果计时器已经在运行,它将被停止并重新启动。这也会改变它的id()

如果 singleShot 为 true,计时器将仅激活一次。这相当于:

timer.setInterval(msec);
timer.start();

注意

使用零计时器使事件循环保持忙碌肯定会引起问题,并导致UI行为高度不稳定。

stop()

停止计时器。

另请参阅

start()

timeout()

当计时器超时时,会发出此信号。

另请参阅

interval start() stop()

timerId()
Return type:

整数

如果计时器正在运行,则返回计时器的ID;否则返回-1。

timerType()
Return type:

TimerType

另请参阅

setTimerType()

属性 timerTypeᅟ 的获取器。