Как нарисовать какой-либо элемент или кнопку поверх MPV встроенного в QWidget (python-mpv+pyside6)
Я использую эту библиотеку (python-mpv) и PySide6 для создания виджета с MPV (QWidget) на python.
Я хочу нарисовать кнопку (или что либо ещё например QLabel?) поверх QWidget (того самого, в который встроен плеер).
Как я могу это сделать? Я пытался нарисовать кнопку поверх виджета, но как только плеер начинает воспроизведение кнопка пропадает. Возможно ли поместить что либо поверх плеера?
UPD: Я нашел что должен скорее всего использовать OpenGl для этого.:https://github.com/mpv-player/mpv-examples/blob/master/libmpv/README.md
Как я могу реализовать это используя PySide6 или PyQT5?
Мой код:
import os
from PySide6 import QtWidgets
os.environ['PATH'] = os.path.dirname(__file__) #you need to place mpv-2.dll (or mpv-1.dll) in folder with project
import mpv
import sys
from PySide6.QtWidgets import *
from PySide6.QtCore import *
class Ui_Form(object):
def setupUi(self, Form):
if not Form.objectName():
Form.setObjectName(u"Form")
Form.resize(780, 477)
self.pushButton = QPushButton(Form)
self.pushButton.setObjectName(u"pushButton")
self.pushButton.setGeometry(QRect(30, 430, 75, 24))
self.retranslateUi(Form)
QMetaObject.connectSlotsByName(Form)
# setupUi
def retranslateUi(self, Form):
Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
self.pushButton.setText(QCoreApplication.translate("Form", u"PushButton", None))
# retranslateUi
class PlayerWidget(QtWidgets.QWidget, Ui_Form):
def __init__(self, parent=None):
super(PlayerWidget, self).__init__(parent)
self.setupUi(self)
self.retranslateUi(self)
class Test(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.container = PlayerWidget()
self.setCentralWidget(self.container)
self.container.setAttribute(Qt.WA_DontCreateNativeAncestors)
self.container.setAttribute(Qt.WA_NativeWindow)
player = mpv.MPV(wid=str(int(self.container.winId())),
vo='gpu',
log_handler=print,
loglevel='debug', ytdl=True)
player.play('test1.mkv') # положите любое тестовое видео в папку
app = QApplication(sys.argv)
# This is necessary since PyQT stomps over the locale settings needed by libmpv.
# This needs to happen after importing PyQT before creating the first mpv.MPV instance.
import locale
locale.setlocale(locale.LC_NUMERIC, 'C')
win = Test()
win.show()
win.resize(1280, 720)
sys.exit(app.exec_())
Библиотека python-mpv требует для запуска mpv-2.dll скачать его вы можете здесь. (sourceforge)
Ответы (1 шт):
Я не могу попробовать ваш пример.
Если использовать:
- Класс QMediaPlayer позволяет воспроизводить источник мультимедиа и
- QGraphicsView с QGraphicsVideoItem,
то получается что-то такое:
import os
from PyQt5 import QtCore, QtGui, QtWidgets, QtMultimedia, QtMultimediaWidgets
from PyQt5.Qt import *
class GraphicsPixmapItem(QGraphicsPixmapItem):
def __init__(self, parent=None):
super(GraphicsPixmapItem, self).__init__(parent)
def mousePressEvent(self, event):
print(f'QGraphicsPixmapItem: {event.pos()}')
super().mousePressEvent(event)
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.videoitem.setSize(QSizeF(640, 480))
self.scene.addItem(self.videoitem)
self.pic = GraphicsPixmapItem(self.videoitem)
self.pic.setPixmap(QPixmap('Ok.png').scaled(40, 40))
self.pic.setFlags(QGraphicsItem.ItemIsSelectable | QGraphicsItem.ItemIsMovable)
self.pic.setOffset(20, 20)
self.text = QGraphicsTextItem(self.videoitem)
self.text.setHtml('<h1>Hello PyQt5</h1>')
self.text.setDefaultTextColor(QColor(66, 222, 88))
self.text.setPos(100, 380)
self._player = QtMultimedia.QMediaPlayer(self, QtMultimedia.QMediaPlayer.VideoSurface)
self._player.stateChanged.connect(self.on_stateChanged)
self._player.setVideoOutput(self.videoitem)
# ----------- установите свое ------------------------> vvvvvvvvvvvvvvvvv <--------
file = os.path.join(os.path.dirname(__file__), "Samonastrojka.avi")
self._player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(file)))
button = QtWidgets.QPushButton("Play")
button.clicked.connect(self._player.play)
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.resize(670, 540)
w.show()
sys.exit(app.exec_())
