You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt6中如何在QVideoWidget上方显示水印QLabel?

解决PyQt6中QVideoWidget上层显示水印标签的问题

问题原因

PyQt6的QVideoWidget依赖底层硬件加速渲染(如Direct3D、OpenGL),其渲染层级独立于普通Qt控件的绘制系统,因此直接调用raise_()无法让QLabel覆盖在视频画面上方。

解决方案:使用容器控件统一管理

创建一个普通QWidget作为容器,将QVideoWidget和水印QLabel都作为该容器的子控件,通过容器的控件层级管理确保标签处于顶层。

修改后的代码示例

from PyQt6.QtCore import Qt, QRect, QUrl
from PyQt6.QtGui import QPixmap
from PyQt6.QtWidgets import QWidget, QApplication, QMainWindow, QFrame, QLabel
from PyQt6.QtMultimedia import QMediaPlayer
from PyQt6.QtMultimediaWidgets import QVideoWidget

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        video_path = 'path\\to\\myvideo.mp4'
        wm_path = 'path\\to\\myimage.png'
        MainWindow.resize(500, 250)
        self.centralwidget = QWidget(parent=MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.frame = QFrame(parent=self.centralwidget)
        self.frame.setGeometry(QRect(0, 0, 400, 300))
        self.frame.setFrameShape(QFrame.Shape.StyledPanel)
        self.frame.setFrameShadow(QFrame.Shadow.Raised)
        self.frame.setObjectName("frame")

        # 创建容器控件,用于承载视频和水印
        self.videoContainer = QWidget(parent=self.frame)
        self.videoContainer.setGeometry(QRect(0, 0, 200, 150))

        self.mediaPlayer = QMediaPlayer(parent=self.frame)
        self.videoWidget = QVideoWidget(parent=self.videoContainer)
        # 让视频控件铺满容器
        self.videoWidget.setGeometry(self.videoContainer.rect())

        self.wmLabel = QLabel(parent=self.videoContainer)
        self.wmLabel.setGeometry(QRect(100, 100, 100, 100))

        pixmap = QPixmap(wm_path)
        self.wmLabel.setPixmap(pixmap)
        self.wmLabel.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
        # 将标签置于容器顶层
        self.wmLabel.raise_()

        MainWindow.setCentralWidget(self.centralwidget)
        self.mediaPlayer.setVideoOutput(self.videoWidget)
        self.mediaPlayer.setSource(QUrl.fromLocalFile(video_path))
        self.mediaPlayer.play()

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec())

关键改动说明

  • 新增videoContainer作为统一容器,将QVideoWidget和wmLabel的父控件都设置为该容器
  • 让QVideoWidget铺满容器,保证视频显示区域正确
  • 调用wmLabel.raise_()确保标签处于容器内的顶层控件,此时能正确覆盖在视频画面上方

补充说明

如果需要更灵活的布局(比如自适应窗口大小),可以使用Qt的布局管理器(如QVBoxLayout、QHBoxLayout)替代绝对定位,只需将videoWidget和wmLabel添加到布局中,再将布局设置给videoContainer即可。

内容的提问来源于stack exchange,提问作者ArMaN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:27:19