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

PyQt5拆分大型摄像头Widget为嵌套小Widget后无显示求助

解决PyQt5嵌套Widget内容不显示问题

问题分析

拆分后的代码存在几个关键错误导致内容无法显示:

  • 父类初始化错误:CameraWidget的__init__中调用super(MyCamera, self).__init__(parent),但类名是CameraWidget;同理CamerasWidget的super调用也用错了类名,这会导致组件初始化异常。
  • 未设置布局:CameraWidget中创建了cam_view标签,但没有将其添加到自身的布局中,标签无法被渲染显示。
  • 耦合性过高:定时器放在CamerasWidget中统一更新,不如让每个CameraWidget自行管理定时器,更符合组件化设计。

修正后的代码

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QHBoxLayout, QWidget
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QPixmap
from PIL.ImageQt import ImageQt
import picamera2

class CameraWidget(QWidget):
    def __init__(self, parent=None, cameraId=0):
        # 修正父类初始化的类名
        super(CameraWidget, self).__init__(parent)
        
        self.camera = picamera2.Picamera2(cameraId)
        self.camera.configure(self.camera.create_preview_configuration(main={"size": (640, 480)}))
        self.camera.start()

        self.cam_view = QLabel()
        # 给当前Widget设置布局,添加显示标签
        layout = QHBoxLayout(self)
        layout.addWidget(self.cam_view)

        # 每个摄像头组件自行管理定时器,解耦设计
        self.timer = QTimer()
        self.timer.timeout.connect(self.update_frame)
        self.timer.start(int(1000 / 24))

    def update_frame(self):
        image = self.camera.capture_image()
        image = image.convert("RGBA")
        qim = ImageQt(image)
        pix = QPixmap.fromImage(qim)
        self.cam_view.setPixmap(pix)

class CamerasWidget(QWidget):
    def __init__(self, parent=None):
        # 修正父类初始化的类名
        super(CamerasWidget, self).__init__(parent)

        # 创建两个摄像头组件
        self.cam1 = CameraWidget(cameraId=0)
        self.cam2 = CameraWidget(cameraId=1)
        
        layout = QHBoxLayout(self)
        layout.addWidget(self.cam1)
        layout.addWidget(self.cam2)

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle("Raspberry Pi Camera Viewer")
        self.setGeometry(100, 100, 1280, 480)

        self.central_widget = CamerasWidget()
        self.setCentralWidget(self.central_widget)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

关键修正点说明

  • 修复父类初始化:确保super()调用的类名与当前类一致,保证组件正确继承初始化。
  • 添加布局到CameraWidget:每个单个摄像头组件内部创建布局并添加显示标签,确保标签能被渲染。
  • 组件化定时器管理:让每个CameraWidget独立管理自己的刷新定时器,降低组件间耦合,更符合可移植性要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:32:05