PyQt4:如何将两个对象添加到中央小部件并显示两个视频

PyQt4: How to add two objects to central widget and display two videos

我想显示从 "videoFrame" 捕获的两个视频,但现在只显示 self.central_widget.setCurrentWidget(self.videoFrame2)。有人知道如何解决这个问题吗?

(注:我使用的是PyQt4和OpenCV3库)

class MyDialog(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyDialog, self).__init__(parent)

        self.left = 700
        self.top = 400
        self.width = 1920
        self.height = 1080

        self.setWindowTitle('Sender')
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.setFixedSize(1920,1080)

        self.videoFrame = ImageWidget()
        self.videoFrame2 = ImageWidget2()

        self.central_widget = QtGui.QStackedWidget()
        self.setCentralWidget(self.central_widget)
        self.central_widget.addWidget(self.videoFrame)
        self.central_widget.setCurrentWidget(self.videoFrame)
        self.central_widget.addWidget(self.videoFrame2)
        self.central_widget.setCurrentWidget(self.videoFrame2)

        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.updateImage)
        self.timer.start(30)
        self.capture1 = cv2.VideoCapture(0)
        self.capture2 = cv2.VideoCapture(1)

    def updateImage(self):
        _, img = self.capture1.read()
        height, width, bpc = img.shape
        bpl = bpc * width
        image = QtGui.QImage(img.data, width, height, bpl, QtGui.QImage.Format_RGB888)
        pixmap2 = image.scaled(300, 300, QtCore.Qt.KeepAspectRatio)
        self.videoFrame.setImage(pixmap2)

        _, img0 = self.capture2.read()
        height, width, bpc = img0.shape
        bpl = bpc * width
        image2 = QtGui.QImage(img0.data, width, height, bpl, QtGui.QImage.Format_RGB888)
        pixmap2 = image2.scaled(300, 300, QtCore.Qt.KeepAspectRatio)
        self.videoFrame2.setImage(pixmap2)

class ImageWidget(QtGui.QWidget):
    def __init__(self,parent=None):
        super(ImageWidget,self).__init__(parent)
        self.image=None

    def setImage(self,image):
        self.image=image
        sz=image.size()
        self.setMinimumSize(sz)
        self.update()

    def paintEvent(self,event):
        qp=QtGui.QPainter()
        qp.begin(self)
        if self.image:
            qp.drawImage(QtCore.QPoint(150,150 ),self.image)
        qp.end()

    # enter code here

class ImageWidget2(QtGui.QWidget):
    def __init__(self,parent=None):
        super(ImageWidget2,self).__init__(parent)
        self.image=None

    def setImage(self,image):
        self.image=image
        sz=image.size()
        self.setMinimumSize(sz)
        self.update()

    def paintEvent(self,event):
        qp=QtGui.QPainter()
        qp.begin(self)
        if self.image:
            qp.drawImage(QtCore.QPoint(450,450 ),self.image)
        qp.end()

A QStackedWidget 会将小部件放在彼此之上。如果您希望小部件并排显示,请使用 QHBoxLayout:

class MyDialog(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyDialog, self).__init__(parent)
        ...

        # self.central_widget = QtGui.QStackedWidget()
        # self.setCentralWidget(self.central_widget)
        # self.central_widget.addWidget(self.videoFrame)
        # self.central_widget.setCurrentWidget(self.videoFrame)
        # self.central_widget.addWidget(self.videoFrame2)
        # self.central_widget.setCurrentWidget(self.videoFrame2)

        widget = QtGui.QWidget(self)
        layout = QtGui.QHBoxLayout(widget)
        layout.addWidget(self.videoFrame)
        layout.addWidget(self.videoFrame2)
        self.setCentralWidget(widget)