You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:35:46