如何用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_())
关键修改说明
- 新增时间定时器:
self.timer_datetime = QTimer(self)创建专门用于时间更新的定时器 - 绑定更新逻辑:将
timeout信号连接到update_datetime函数,每次触发就同步当前系统时间 - 启动定时器:
self.timer_datetime.start(1000)设置1秒触发一次,确保时间每秒刷新 - 额外优化:给摄像头定时器
self.timer_camera.start(30)加上30毫秒的间隔,避免无限制触发
另外,原代码中的Thread1和Thread2完全没有被使用到,可以直接删除,减少冗余代码。
内容的提问来源于stack exchange,提问作者tirit
相关产品推荐
相关产品推荐

