【问题标题】:How to draw QtGraphicsView on Top of QVideoWidget with transparency如何在 QVideoWidget 顶部以透明度绘制 QtGraphicsView
【发布时间】:2019-05-22 19:24:42
【问题描述】:

我正在尝试在视频播放器 (QVideoWidget) 上叠加一些图形 (QtGraphicsView)。我已经尝试将 QtGraphicsView 子类样式表设置为透明和背景画笔,但没有一个工作。

#self.setBackgroundBrush(QtGui.QBrush(QtGui.QColor(30, 30, 30, 3)))
#self.setStyleSheet("background-color:rgba(0,0,0,0)")
#self.setStyleSheet("background:rgba(0,0,0,0)")
self.setStyleSheet("background:transparent")
self.setStyleSheet("background-color:transparent")
self.setStyleSheet("background-color:rgba(30,30,30,3)")
self.setStyleSheet("background:rgba(30,30,30,3)")

实际意图是轻松裁剪视频(视觉方式)。所有其他工作都完成了关于捕获事件、做数学等。这张图片很好地解释了情况。。在这一点上感觉,我肯定做错了,在 QtMultiMedia 组件中必须有一些更简单的方法来绘制它们。任何想法都非常感谢。

【问题讨论】:

    标签: python pyqt pyqt5 qgraphicsview qtmultimedia


    【解决方案1】:

    一种可能的解决方案是使用 QGraphicsVideoItem 代替 QVideoWidget 并将其嵌入到 QGraphicsView 中,然后可以将其他项设为 QGraphicsVideoItem 的子项,使其位于顶部,此外新项的位置将与QGraphicsVideoItem。

    import os
    from PyQt5 import QtCore, QtGui, QtWidgets, QtMultimedia, QtMultimediaWidgets
    
    class Widget(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super(Widget, self).__init__(parent)
    
            self._scene = QtWidgets.QGraphicsScene(self)
            self._gv = QtWidgets.QGraphicsView(self._scene)
    
            self._videoitem = QtMultimediaWidgets.QGraphicsVideoItem()
            self._scene.addItem(self._videoitem)
            self._ellipse_item = QtWidgets.QGraphicsEllipseItem(QtCore.QRectF(50, 50, 40, 40), self._videoitem)
            self._ellipse_item.setBrush(QtGui.QBrush(QtCore.Qt.green))
            self._ellipse_item.setPen(QtGui.QPen(QtCore.Qt.red))
    
            self._player = QtMultimedia.QMediaPlayer(self, QtMultimedia.QMediaPlayer.VideoSurface)
            self._player.stateChanged.connect(self.on_stateChanged)
            self._player.setVideoOutput(self._videoitem)
    
            file = os.path.join(os.path.dirname(__file__), "small.mp4")
            self._player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(file)))
            button = QtWidgets.QPushButton("Play")
            button.clicked.connect(self._player.play)
    
            self.resize(640, 480)
            lay = QtWidgets.QVBoxLayout(self)
            lay.addWidget(self._gv)
            lay.addWidget(button)
    
        @QtCore.pyqtSlot(QtMultimedia.QMediaPlayer.State)
        def on_stateChanged(self, state):
            if state == QtMultimedia.QMediaPlayer.PlayingState:
                self._gv.fitInView(self._videoitem, QtCore.Qt.KeepAspectRatio)
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication(sys.argv)
        w = Widget()
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 2021-07-29
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 2013-05-13
      相关资源
      最近更新 更多