PySide6.QtCore.QTimer¶
- class QTimer¶
-
概要¶
属性¶
intervalᅟ
- 超时间隔,以毫秒为单位remainingTimeᅟ
- 剩余时间(以毫秒为单位)singleShotᅟ
- 定时器是否为单次定时器timerTypeᅟ
- 控制计时器的精度
方法¶
def
__init__()
def
id()
def
interval()
def
isActive()
def
isSingleShot()
def
remainingTime()
def
setInterval()
def
setSingleShot()
def
setTimerType()
def
timerId()
def
timerType()
插槽¶
信号¶
def
timeout()
静态函数¶
def
singleShot()
注意
本文档可能包含从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
。对于PreciseTimer
,QTimer
将尝试将准确性保持在1毫秒。精确计时器也不会比预期提前超时。对于
CoarseTimer
和VeryCoarseTimer
类型,QTimer
可能会比预期提前唤醒,在这些类型的误差范围内:CoarseTimer
的误差为间隔的5%,而VeryCoarseTimer
的误差为500毫秒。如果系统繁忙或无法提供所需的精度,所有计时器类型可能会比预期更晚超时。在这种情况下,即使多个超时已过期,Qt 也只会发出一次
timeout()
,然后恢复原始间隔。QTimer的替代方案¶
Qt 6.8 引入了
QChronoTimer
。这两个类之间的主要区别是,QChronoTimer
支持更大的时间间隔范围和更高的精度(std::chrono::nanoseconds
)。对于QTimer
,支持的最大时间间隔是 ±24 天,而对于QChronoTimer
,它是 ±292 年(在时间间隔超过std::numeric_limits
时,整数溢出的可能性更小)。如果你只需要毫秒级的分辨率和 ±24 天的时间范围,你可以继续使用::max() QTimer
。另一个替代方案是在你的类中重新实现
timerEvent()
方法(该类必须是QObject
的子类),并使用以下方法之一:使用
QBasicTimer
,这是一个轻量级的包装计时器ID的值类。你可以使用QBasicTimer::start()启动计时器,并使用stop()
停止它。你可以在重新实现的timerEvent()
中处理事件。一种更低级别的方法是直接操作计时器ID。要启动计时器,调用
startTimer()
,并存储返回的ID。要停止计时器,调用killTimer()
。您可以在重新实现的timerEvent()
中处理事件。这种方法通常比使用QBasicTimer
更繁琐。
使用
timerEvent()
的一个缺点是,一些高级功能,如单次定时器和信号,不受支持。一些操作系统限制了可以使用的计时器数量;Qt 试图绕过这些限制。
另请参阅
QBasicTimer
QTimerEvent
timerEvent()
TimersAnalog Clock
注意
当使用
from __feature__ import true_property
时,属性可以直接使用,否则通过访问器函数使用。- property activeᅟ: bool¶
如果计时器正在运行,则此布尔属性为
true
;否则为 false。- Access functions:
- property intervalᅟ: int¶
此属性保存超时间隔,单位为毫秒。
此属性的默认值为0。一个超时间隔为0的
QTimer
将在窗口系统事件队列中的所有事件处理完毕后立即超时。设置正在运行的计时器的间隔将更改间隔,
stop()
然后start()
计时器,并获取一个新的id()
。如果计时器没有运行,则只更改间隔。另请参阅
- Access functions:
- property remainingTimeᅟ: int¶
此属性保存剩余的毫秒数。
返回计时器剩余的毫秒数,直到超时。如果计时器未激活,返回值将为-1。如果计时器已超时,返回值将为0。
另请参阅
- Access functions:
- property singleShotᅟ: bool¶
此属性表示计时器是否为单次计时器。
单次计时器只触发一次,非单次计时器每隔
interval
毫秒触发一次。此属性的默认值为
false
。另请参阅
- Access functions:
- property timerTypeᅟ: Qt.TimerType¶
此属性控制计时器的准确性。
此属性的默认值为
Qt::CoarseTimer
。另请参阅
- Access functions:
使用给定的
parent
构造一个计时器。如果计时器正在运行,则返回表示计时器ID的
TimerId
;否则返回Qt::TimerId::Invalid
。另请参阅
- interval()¶
- Return type:
整数
另请参阅
属性
intervalᅟ
的获取器。- isActive()¶
- Return type:
布尔
如果计时器正在运行,则返回
true
;否则返回false
。属性
activeᅟ
的获取器。- isSingleShot()¶
- Return type:
布尔
属性
singleShotᅟ
的获取器。- remainingTime()¶
- Return type:
整数
属性
remainingTimeᅟ
的获取器。- setInterval(msec)¶
- Parameters:
毫秒 – 整数
另请参阅
属性
intervalᅟ
的设置器。- setSingleShot(singleShot)¶
- Parameters:
singleShot – 布尔值
另请参阅
属性
singleShotᅟ
的设置器。属性
timerTypeᅟ
的设置器。- static singleShot(msec, functor)¶
- Parameters:
msec – int
函子 –
PyCallable
- static singleShot(msec, context, functor)
- Parameters:
msec – int
context –
QObject
函子 –
PyCallable
- static singleShot(msec, receiver, member)
- Parameters:
msec – int
receiver –
QObject
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
毫秒。另请参阅
- static singleShot(msec, timerType, receiver, member)
这是一个重载函数。
使用chrono重载。这个静态函数在给定的时间间隔后调用一个槽。
使用此函数非常方便,因为您不需要费心处理
timerEvent
或创建本地的QTimer
对象。receiver
是接收对象,member
是插槽。时间间隔为msec
毫秒。timerType
影响计时器的准确性。另请参阅
- start()¶
此函数重载了start()。
使用
interval
中指定的超时时间启动或重新启动计时器。如果计时器已经在运行,它将被
停止
并重新启动。这也会改变它的id()
。如果
singleShot
为 true,计时器将仅激活一次。- start(msec)
- Parameters:
毫秒 – 整数
以
msec
毫秒的超时间隔启动或重新启动计时器。如果计时器已经在运行,它将被
停止
并重新启动。这也会改变它的id()
。如果
singleShot
为 true,计时器将仅激活一次。这相当于:timer.setInterval(msec); timer.start();
注意
使用零计时器使事件循环保持忙碌肯定会引起问题,并导致UI行为高度不稳定。
- stop()¶
停止计时器。
另请参阅
- timeout()¶
当计时器超时时,会发出此信号。
- timerId()¶
- Return type:
整数
如果计时器正在运行,则返回计时器的ID;否则返回-1。
- timerType()¶
- Return type:
另请参阅
属性
timerTypeᅟ
的获取器。