gpt4 book ai didi

python - 如何在 QVideoWidget 之上以透明度绘制 QtGraphicsView

转载 作者:行者123 更新时间:2023-12-01 08:31:25 31 4
gpt4 key购买 nike

我试图在视频播放器(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)")

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

最佳答案

一种可能的解决方案是使用 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

关于python - 如何在 QVideoWidget 之上以透明度绘制 QtGraphicsView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53899740/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com