Есть окно с прозрачным бек фоном через QT.WA_TranslucentBackground
В нем расположен QVideoWidget для проигрывания видео.
Но при активном флаге QT.WA_TranslucentBackground видео не показывается. Когда флаг отключаю и экран серый то все ок.
Нагуглила единственный вариант решения проблемы:
"I solve the problem .when we set the WA_TranslucentBackground flag and FramelessWindowHint attribute the QVideoWidget's QPainter going to QPainter::CompositionMode_DestinationOver mode and it cause to nothing to show or a shadow on the screen . in this case i use a custom video widget and in paintEvent after createing QPainter painter(this); add
painter.setCompositionMode(QPainter::RasterOp_SourceAndNotDestination); or
painter.setCompositionMode(QPainter::RasterOp_SourceAndDestination);
ссылка на stackoverflow
Только вот никак не могу понять где этот
painter.setCompositionMode(QPainter::RasterOp_SourceAndNotDestination); or
painter.setCompositionMode(QPainter::RasterOp_SourceAndDestination);
пробовала создавать паинт ивент но не помогает
def paintEvent(self, QPaintEvent): painter = QPainter(self) painter.setCompositionMode(QPainter.RasterOp_SourceAndNotDestination)
Вот код моего файла если поможет:
from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtMultimedia import * from PyQt5.QtMultimediaWidgets import * from PyQt5.QtGui import * from functions.main_funcs import (getScreen) import os import configparser import config class VideoPlayer(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowFlags(Qt.FramelessWindowHint | Qt.Tool) # окно без рамок и заголовка, не отображается на панели задач self.setAttribute(Qt.WA_TranslucentBackground) # прозрачный бек окна self.setFixedSize(678, 398) self.setObjectName('VideoPlayer') # Объявляем позицию окна для последущей записи self.WF_wx = 0 self.WF_wy = 0 # CONFIG self.config = configparser.ConfigParser() # Media Player self.player = QMediaPlayer() self.player.setVolume(10) self.mediaFile = QMediaContent(None) # BG self.bg = QLabel(self) self.bg.setObjectName('bg') self.bg.setStyleSheet( "background-repeat: none; background-image: url(.data/img/videoPlayer2.png); background-position:0 0;") self.bg.setFixedSize(678, 398) self.bg.move(0, 0) self.bg.installEventFilter(self) # closeButton self.closeButton = QPushButton(self) self.closeButton.setObjectName('closeButton') style = """QPushButton {border-image: url(.data/img/x.png) 0 0 0 0 stretch stretch; border: 0px solid transparent;} QPushButton:hover {border-image: url(.data/img/x2.png) 0 0 0 0 stretch stretch; border: 0px solid transparent;} """ self.closeButton.setStyleSheet(style) self.closeButton.setCursor(Qt.PointingHandCursor) self.closeButton.setFixedSize(23, 22) self.closeButton.move(614, -1) self.closeButton.installEventFilter(self) self.closeButton.clicked.connect(self.closePlayer) # Total time self.totalTime = QLabel("00:00:00", self) self.totalTime.setObjectName('totalTime') self.totalTime.setStyleSheet("background: transparent; color:#409aff; font: 10px;") font = QFont("Tahoma") self.totalTime.setFont(font) self.totalTime.setFixedSize(40, 16) self.totalTime.move(46, 2) # Black Layer BG self.bg2 = QLabel(self) self.bg2.setObjectName('bg2') self.bg2.setStyleSheet("background: #000000;") self.bg2.setFixedSize(640, 360) self.bg2.move(19, 19) # VIDEO WIDGET self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface) self.videoWidget = QVideoWidget(self) self.videoWidget.setObjectName('videoWidget') self.videoWidget.setFixedSize(640, 360) self.videoWidget.move(19, 19) self.videoWidget.show() self.mediaPlayer.setVideoOutput(self.videoWidget) self.mediaPlayer.setMedia(QMediaContent(QUrl("https://cs1-67v4.vk-cdn.net/p21/0f8a674b8080.1080.mp4"))) self.mediaPlayer.setVolume(10) self.mediaPlayer.play() self.show() # Получаем данные о расположении окна и записываем в конфиг положение окна если его нет screen = getScreen() widget_xy_x = int((screen[0] / 2) - 339) widget_xy_y = int((screen[1] / 2) - 199) try: self.config.read('config.ini', 'utf8') widget_xy_x = int(self.config.get('videPlayerXY', 'x')) widget_xy_y = int(self.config.get('videPlayerXY', 'y')) except configparser.NoSectionError: self.config.add_section('videPlayerXY') self.config.set('videPlayerXY', 'x', '0') self.config.set('videPlayerXY', 'y', '0') with open('config.ini', 'w', encoding='utf8') as configfile: self.config.write(configfile) finally: self.move(widget_xy_x, widget_xy_y) def handleError(self): print(self.mediaPlayer.errorString()) def closePlayer(self): # Закрываем окно self.mediaFile = QMediaContent(QUrl.fromLocalFile('.data/sounds/clickM.wav')) self.player.setMedia(self.mediaFile) self.player.play() self.hide() # Ловим события hover/click и т.д. def eventFilter(self, obj, event): # print(event.type()) if event.type() == 3: # clickButton pass elif event.type() == 10: # mouseEnter if obj.objectName() == 'closeButton': self.mediaFile = QMediaContent(QUrl.fromLocalFile('.data/sounds/hover.wav')) self.player.setMedia(self.mediaFile) self.player.play() elif event.type() == 11: # mouseLeave pass return False # Возможность перемещения окна def mousePressEvent(self, event): self.offset = event.pos() def mouseMoveEvent(self, event): x = event.globalX() y = event.globalY() x_w = self.offset.x() y_w = self.offset.y() w_x = x - x_w w_y = y - y_w # Вычисляем размеры экрана и не даем окну выходить за его пределы if (w_x < 0): w_x = 0 if (w_y < 0): w_y = 0 screen = getScreen() screen_w = screen[0] screen_h = screen[1] win_w = self.width() win_h = self.height() if (w_x > (screen_w - win_w)): w_x = screen_w - win_w if (w_y > (screen_h - win_h)): w_y = screen_h - win_h self.WF_wx = w_x self.WF_wy = w_y # двигаем окно по позиции self.move(w_x, w_y) def mouseReleaseEvent(self, event): # Записываем в конфиг положение окна после перетаскивания self.config.read('config.ini', 'utf8') self.config.set('videPlayerXY', 'x', str(self.WF_wx)) self.config.set('videPlayerXY', 'y', str(self.WF_wy)) with open('config.ini', 'w', encoding='utf8') as configfile: self.config.write(configfile) def toggle(self): if self.isHidden(): self.show() self.activateWindow() else: self.hide()