【问题标题】:QtMediaplayer wont work on frameless and translucent background PyQt5Qt 媒体播放器在无框和半透明背景 PyQt5 上不起作用
【发布时间】:2021-03-07 06:47:38
【问题描述】:

我正在使用 QMediaplayer 制作视频播放器,但它不适用于无框和半透明背景窗口。我想制作圆角窗口,所以我需要无框和半透明窗口。 这是我的代码:

from PyQt5.QtCore import Qt, QUrl
from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtWidgets import QApplication,QMainWindow,QFrame
import sys     
class Player(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("PyQt Video Player Widget Example") 
        self.resize(600,400)
        self.frame=QFrame(self)
        self.frame.setStyleSheet('background:grey;border-radius:20px;')
        self.setCentralWidget(self.frame)
        #self.setWindowFlag(Qt.FramelessWindowHint)
        #self.setAttribute(Qt.WA_TranslucentBackground)
        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        videoWidget = QVideoWidget(self.frame)
        videoWidget.setGeometry(10,10,580,380)
        self.resize(600,400)
        self.mediaPlayer.error.connect(self.handleError)
        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.setMedia(
                         QMediaContent(QUrl.fromLocalFile("C:/Users/mishra/Desktop/HiddenfilesWindow/10000000_1874628825927192_6229658593205944320_n(1).mp4")))
        self.mediaPlayer.play()
    def handleError(self):
        print("Error: " + self.mediaPlayer.errorString())
          
if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    window = Player()
    
    window.show()
    sys.exit(app.exec_())

设置半透明背景后,它只播放音频不播放视频。有人知道如何修复它吗?

【问题讨论】:

  • 我没有在 PyQt5 5.9.2 上重现该问题
  • 你取消注释是否意味着删除我提到的那些注释行。但无论如何我在 5.15 @alec 中遇到了这个问题
  • 是的,我取消了这些行的注释
  • 我现在能做什么?

标签: python python-3.x qt pyqt5 qt5


【解决方案1】:

试试看:

import sys
from PyQt5.QtCore import Qt, QUrl, QRectF
from PyQt5.QtGui import QPainterPath, QRegion
from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtWidgets import QApplication, QMainWindow, QFrame, QWidget, QHBoxLayout
     

class Player(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("PyQt Video Player Widget Example") 
        self.resize(600,400)
        self.frame= QFrame(self)  
        
#        self.frame.setStyleSheet('background:grey; border-radius: 20px;')
        self.setStyleSheet("Player {background: #000;}")                   # +++
        
        self.setCentralWidget(self.frame)
#        self.setWindowFlag(Qt.FramelessWindowHint)
#        self.setAttribute(Qt.WA_TranslucentBackground)

        layout = QHBoxLayout(self.frame)                                   # +++
        videoWidget = QVideoWidget()                                       # +++
        layout.addWidget(videoWidget)                                      # +++

        
        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
#        videoWidget = QVideoWidget(self.frame)             
#        videoWidget.setGeometry(10,10,580,380)
#        self.resize(600,400)
        self.mediaPlayer.error.connect(self.handleError)
        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.setMedia(
            QMediaContent(QUrl.fromLocalFile("Samonastrojka.avi")))
        self.mediaPlayer.play()

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
    def resizeEvent(self, event):
        path = QPainterPath()
        path.addRoundedRect(QRectF(self.rect()), 20, 20)
        reg = QRegion(path.toFillPolygon().toPolygon())
        self.setMask(reg)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        
    def handleError(self):
        print("Error: " + self.mediaPlayer.errorString())
   
   
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Player()
    window.show()
    sys.exit(app.exec_())

【讨论】:

  • 这个问题很有趣。我无法检查您的答案,但我知道我可以相信您的测试。尽管如此,您的回答仍然没有提供足够的上下文(再次)。它解决了问题吗?是的。它是否提供实际和教学帮助(这是 SO 最重要的原则之一,因为应始终提供上下文/论证)?绝对。不要误会我的意思:我感谢您的努力(我能认出您的“箭头答案”屏幕截图,我喜欢它们),但我不得不说,您的答案不是好答案只要你写下你的“试试看”。
  • 是的,它工作正常。这意味着半透明背景中存在问题或者它是一个错误?你能像我以前的那样把角落弄光滑吗?它的边缘不是那么光滑。谢谢你的努力. @S。尼克
猜你喜欢
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
相关资源
最近更新 更多