QTimer运行时修改间隔且不重启计时的实现方案
问题:实现考虑已流逝时间的动态间隔QTimer
对QTimer调用setInterval会直接重启计时间隔,现在需要实现一个能考虑已流逝时间的定时器,具体需求如下:
- 示例场景:
- 初始将QTimer设置为每5分钟触发一次
- 在上一次触发2分钟后,操作人员通过GUI将定时器间隔修改为4分钟
- QTimer默认行为下,下一次触发会在上一次触发后6分钟(已流逝的2分钟+新间隔4分钟)发生,但实际需求是在上一次触发后4分钟触发,之后保持每4分钟触发一次
目前能想到的实现方式是:停止多射定时器,触发一个单次定时器(时长计算为new_interval - old_interval + remainingTime),再以新间隔重启多射定时器,但这种方法步骤繁琐,想询问是否有更简洁的实现方案?
以下是展示QTimer修改间隔时会重启计时的最简代码:
import sys import time from PyQt5 import QtWidgets from PyQt5 import QtCore class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.interval_seconds = 5 self.start_time = time.time() self.last_trigger = self.start_time self.timer = QtCore.QTimer() self.timer.setInterval(self.interval_seconds * 1000) self.timer.timeout.connect(self.trigger) self.timer.start() # 通过另一个定时器获取第一个定时器的状态 self.timer2 = QtCore.QTimer() self.timer2.setInterval(1000) self.timer2.timeout.connect(self.update_status) self.timer2.start() # GUI布局 layout = QtWidgets.QVBoxLayout() self.interval = QtWidgets.QSpinBox() self.interval.setValue(self.interval_seconds) self.set_btn = QtWidgets.QPushButton("设置间隔") self.set_btn.clicked.connect(self.set_interval) self.text1 = QtWidgets.QPlainTextEdit() self.text2 = QtWidgets.QLabel() self.text3 = QtWidgets.QLabel() layout.addWidget(QtWidgets.QLabel("间隔(秒)")) layout.addWidget(self.interval) layout.addWidget(self.set_btn) layout.addWidget(self.text1) layout.addWidget(self.text2) layout.addWidget(self.text3) widget = QtWidgets.QWidget() widget.setLayout(layout) self.setCentralWidget(widget) self.show() def trigger(self): self.last_trigger = time.time() self.text1.appendPlainText( f"触发 @ {(self.last_trigger - self.start_time):.1f}秒" ) def update_status(self): time_gone = time.time() - self.last_trigger time_left = (self.timer.remainingTime() // 1000) + 1 self.text2.setText(f"已流逝时间 (秒) {time_gone:.1f} ") self.text3.setText(f"下次触发剩余时间 (秒) {time_left:.1f} ") def set_interval(self): self.interval_seconds = self.interval.value() self.timer.setInterval(self.interval_seconds * 1000) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) mw = MainWindow() sys.exit(app.exec())
内容的提问来源于stack exchange,提问作者elfnor
相关产品推荐
相关产品推荐

