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

如何用PyQt5实现实时更新的日期时间组件?

修复PyQt5中QDateTimeEdit实时更新问题

你的问题根源很明确:QDateTimeEdit控件只在程序启动时被设置了一次当前时间,没有定时刷新的逻辑,所以时间不会自动推进。只需要添加一个定时器,每秒更新一次控件的时间即可解决。

修改步骤

  • 新增一个QTimer专门用于时间更新,设置每秒触发一次
  • 编写槽函数,每次触发时将控件时间同步为当前系统时间
  • 在初始化时启动这个定时器

修改后的完整代码

import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import cv2

class Video(QWidget):
    def __init__(self):
        super(Video, self).__init__()
        self.frame = []
        self.detectFlag = False
        self.cap = []
        self.timer_camera = QTimer()
        # 新增:用于更新时间的定时器
        self.timer_datetime = QTimer(self)

        self.resize(900, 600)
        self.setWindowTitle("Proje")

        self.label = QLabel(self)
        self.label.setFixedSize(800, 500)
        self.label.move(50, 40)

        self.btn = QPushButton(self)
        self.btn.setText("Start")
        self.btn.setToolTip("Start the camera.")
        self.btn.setFixedSize(100, 30)
        self.btn.move(60, 540)
        self.btn.clicked.connect(self.slotStart)

        self.btn_stop = QPushButton(self)
        self.btn_stop.setText("Stop")
        self.btn_stop.setToolTip("Stop the camera.")
        self.btn_stop.setFixedSize(100, 30)
        self.btn_stop.move(180, 540)
        self.btn_stop.clicked.connect(self.slotStop)

        self.datetimeedit = QDateTimeEdit(self)
        self.datetimeedit.setDateTime(QDateTime.currentDateTime())
        self.datetimeedit.setDateTimeRange(QDateTime(1900, 1, 1, 00, 00, 00), QDateTime(2100, 1, 1, 00, 00, 00))
        self.datetimeedit.setDisplayFormat('yyyy.MM.dd hh:mm:ss')
        self.datetimeedit.setFixedSize(200, 30)
        self.datetimeedit.move(580, 540)
        self.datetimeedit.setToolTip("This widget shows the time and date.")

        self.spin = QSpinBox(self)
        self.spin.setToolTip("This is an increasing and decreasing number widget as you want.")
        self.spin.move(800, 540)
        self.spin.setFixedSize(30, 30)

        # 新增:绑定时间更新槽函数,设置1秒触发一次并启动定时器
        self.timer_datetime.timeout.connect(self.update_datetime)
        self.timer_datetime.start(1000)

    def slotStart(self):
        self.cap = cv2.VideoCapture(0)
        self.timer_camera.start(30)  # 这里建议加个帧率参数,比如30毫秒一次
        self.timer_camera.timeout.connect(self.openFrame)

    def slotStop(self):
        if self.cap != []:
            self.cap.release()
            self.timer_camera.stop()

    def openFrame(self):
        if (self.cap.isOpened()):
            ret, self.frame = self.cap.read()
            if ret:
                frame = cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB)
                height, width, bytesPerComponent = frame.shape
                bytesPerLine = bytesPerComponent * width
                q_image = QImage(frame.data, width, height, bytesPerLine,
                                 QImage.Format_RGB888).scaled(self.label.width(), self.label.height())
                self.label.setPixmap(QPixmap.fromImage(q_image))
            else:
                self.cap.release()
                self.timer_camera.stop()

    # 新增:时间更新槽函数
    def update_datetime(self):
        self.datetimeedit.setDateTime(QDateTime.currentDateTime())

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    my = Video()
    my.show()
    sys.exit(app.exec_())

关键修改说明

  1. 新增时间定时器:self.timer_datetime = QTimer(self)创建专门用于时间更新的定时器
  2. 绑定更新逻辑:将timeout信号连接到update_datetime函数,每次触发就同步当前系统时间
  3. 启动定时器:self.timer_datetime.start(1000)设置1秒触发一次,确保时间每秒刷新
  4. 额外优化:给摄像头定时器self.timer_camera.start(30)加上30毫秒的间隔,避免无限制触发

另外,原代码中的Thread1和Thread2完全没有被使用到,可以直接删除,减少冗余代码。

内容的提问来源于stack exchange,提问作者tirit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:33:20