Как нарисовать QtGraphicsView поверх QVideoWidget с прозрачностью - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь наложить некоторую графику (QtGraphicsView) поверх видеоплеера (QVideoWidget).Я уже пытался установить таблицы стилей подкласса 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)")

Фактические намерения - легко обрезать видео (визуальный способ).Вся остальная работа выполняется относительно захвата событий, математики и т. Д. Это изображение довольно хорошо объясняет ситуацию. pyqt5 ui.На этом этапе кажется, что, конечно, я делаю это неправильно, в Компонентах QtMultiMedia должен быть какой-то более простой способ рисовать поверх них.Любые идеи действительно ценятся.

1 Ответ

0 голосов
/ 23 декабря 2018

Одним из возможных решений является использование 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_())

enter image description here

...