0

当我像这样设置 QFrame 的样式表时,我遇到了 QFrame 的问题;

frame = QFrame(self.window)
frame.setObjectName('Custom_Widget')
frame.setStyleSheet("""
   #Custom_Widget {
     background: #002025;
     border-radius: 20px;
     opacity: 100;
     border: 2px solid #ff2025;                   
        }""")

就像这样; 图像1

您会看到圆角,但小部件未圆角。是长方形。这是我的第一个问题。我的第二个问题是 img2 您看到 QMediaPlayer 的角不圆,因为它溢出了 QWidget。我怎么解决这个问题?

我的所有代码如下;

# PyQt5 Video player
#!/usr/bin/env python

from PyQt5.QtCore import QDir, Qt, QUrl,QRect, pyqtSignal
from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtWidgets import (QApplication, QFileDialog, QHBoxLayout, QLabel,
        QPushButton, QSizePolicy, QSlider, QStyle, QVBoxLayout, QWidget,QProgressBar,QFrame)
from PyQt5.QtWidgets import QMainWindow,QWidget, QPushButton, QAction
from PyQt5.QtGui import QIcon
import sys,os

class VideoWindow(QMainWindow):
    closeSignal = pyqtSignal(int)

    def __init__(self, parent=None):
        super(VideoWindow, self).__init__(parent)

    def setupUi(self,window):
        self.window = window
        self.window.setFixedSize(784,442)
        #self.window.setFixedSize(884,542)
        self.window.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint|Qt.WA_TranslucentBackground)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        widget = QWidget(self.window)

        widget.setObjectName('Custom_Widget')
        widget.setStyleSheet("""
        #Custom_Widget {
            background: #002025;
            border-radius: 20px;
            opacity: 100;
            border: 2px solid #ff2025;
        }
        """)

        videoWidget = QVideoWidget(widget)
        videoWidget.setGeometry(QRect(0,0,784, 442))

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(os.getcwd() + "\\logo-anim.avi")))
        self.mediaPlayer.play()
        #self.mediaPlayer.stateChanged.connect(lambda x: self.closeSignal.emit(x))
        self.mediaPlayer.stateChanged.connect(lambda x: sys.exit())
        
        self.window.setCentralWidget(widget)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QMainWindow()
    player = VideoWindow()
    player.setFixedSize(784, 442)
    player.setupUi(w)
    w.show()
    sys.exit(app.exec_())
4

1 回答 1

0

您的代码中有很多问题和误解,这也很令人困惑。

  • 您正在创建一个VideoWindow未使用的 QMainWindow ( )。
  • 您将视频小部件添加为 QWidget 的子小部件,并为 QMainWindow、QWidget 和 QVideoWidget 设置相同的几何图形;如果它们都具有相同的几何形状,您将如何期望有边界?
  • 如果您想要一个带有边框且没有其他功能的普通小部件,那么使用 QMainWindow 不仅没有必要,而且也是错误的:QMainWindows 提供了内部布局、支持状态栏、工具栏、停靠小部件和菜单等功能,而您显然不是打算使用;一个 QWidget 将被使用。
  • 如果一个小部件将有子部件,则应避免使用固定的几何图形,而应始终使用布局管理器,即使只有一个小部件;
  • 通过样式表设置圆形边框不会改变小部件的实际形状(始终是矩形),您需要改为应用遮罩
  • 您正在尝试使用Qt.WidgetAttributefor 窗口标志,这不仅非常错误,而且还会导致一些问题,因为它不是窗口标志;此类属性必须与setAttribute().
  • 设置无框架标志可能会阻止在大多数系统中移动窗口,您应该通过提供适当的鼠标交互来解决这个问题。
  • 通常最好为新的 Qt 对象设置父对象(除非它们是小部件),尤其是当它们使用线程/并发处理(如 QMediaPlayer)时,因此当父对象存在时它们将被正确删除,并且系统资源被正确释放。

这是您的代码的修订版。

class VideoWindow(QWidget):
    closeSignal = pyqtSignal(int)

    def __init__(self, parent=None):
        super(VideoWindow, self).__init__(parent)

        self.setFixedSize(784,442)
        self.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint)
        self.setAttribute(Qt.WA_TranslucentBackground)

        self.setStyleSheet("""
        VideoWindow {
            background: #002025;
            border-radius: 20px;
            opacity: 100;
            border: 2px solid #ff2025;
        }
        """)

        layout = QHBoxLayout(self)
        videoWidget = QVideoWidget()
        layout.addWidget(videoWidget)

        self.mediaPlayer = QMediaPlayer(self, QMediaPlayer.VideoSurface)
        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(os.getcwd() + "/test.mp4")))
        self.mediaPlayer.play()

        self.startPos = None

    def mousePressEvent(self, event):
        self.startPos = event.pos()

    def mouseMoveEvent(self, event):
        if self.startPos:
            self.move(self.pos() + (event.pos() - self.startPos))

    def mouseReleaseEvent(self, event):
        self.startPos = None

    def resizeEvent(self, event):
        path = QPainterPath()
        path.addRoundedRect(QRectF(self.rect()), 20, 20)
        reg = QRegion(path.toFillPolygon().toPolygon())
        self.setMask(reg)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    player = VideoWindow()
    player.setFixedSize(784, 442)
    player.show()
    sys.exit(app.exec_())
于 2020-11-20T15:27:24.367 回答