Files
2025-08-14 18:45:16 +08:00

93 lines
2.7 KiB
Python

# coding:utf-8
from PySide6.QtCore import Qt, Signal, QUrl, QSizeF, QTimer
from PySide6.QtGui import QPainter
from PySide6.QtMultimediaWidgets import QGraphicsVideoItem
from PySide6.QtWidgets import QWidget, QGraphicsView, QVBoxLayout, QGraphicsScene
from ..common.style_sheet import FluentStyleSheet
from .media_play_bar import StandardMediaPlayBar
class GraphicsVideoItem(QGraphicsVideoItem):
""" Graphics video item """
def paint(self, painter: QPainter, option, widget):
painter.setCompositionMode(QPainter.CompositionMode_Difference)
super().paint(painter, option, widget)
class VideoWidget(QGraphicsView):
""" Video widget """
def __init__(self, parent=None):
super().__init__(parent)
self.isHover = False
self.timer = QTimer(self)
self.vBoxLayout = QVBoxLayout(self)
self.videoItem = QGraphicsVideoItem()
self.graphicsScene = QGraphicsScene(self)
self.playBar = StandardMediaPlayBar(self)
self.setMouseTracking(True)
self.setScene(self.graphicsScene)
self.graphicsScene.addItem(self.videoItem)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform)
self.player.setVideoOutput(self.videoItem)
FluentStyleSheet.MEDIA_PLAYER.apply(self)
self.timer.timeout.connect(self._onHideTimeOut)
def setVideo(self, url: QUrl):
""" set the video to play """
self.player.setSource(url)
self.fitInView(self.videoItem, Qt.KeepAspectRatio)
def hideEvent(self, e):
self.pause()
e.accept()
def wheelEvent(self, e):
return
def enterEvent(self, e):
self.isHover = True
self.playBar.fadeIn()
def leaveEvent(self, e):
self.isHover = False
self.timer.start(3000)
def _onHideTimeOut(self):
if not self.isHover:
self.playBar.fadeOut()
def play(self):
self.playBar.play()
def pause(self):
self.playBar.pause()
def stop(self):
self.playBar.stop()
def togglePlayState(self):
""" toggle play state """
if self.player.isPlaying():
self.pause()
else:
self.play()
def resizeEvent(self, e):
super().resizeEvent(e)
self.videoItem.setSize(QSizeF(self.size()))
self.fitInView(self.videoItem, Qt.KeepAspectRatio)
self.playBar.move(11, self.height() - self.playBar.height() - 11)
self.playBar.setFixedSize(self.width() - 22, self.playBar.height())
@property
def player(self):
return self.playBar.player