Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » QVideoWidget и WA_TranslucentBackground Помогите!!! [RSS Feed]

#1 Июнь 30, 2017 18:14:39

Edith
Зарегистрирован: 2017-06-01
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

QVideoWidget и WA_TranslucentBackground Помогите!!!

Всем доброго времени суток!

Есть окно с прозрачным бек фоном через 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);
to change the composition mode."
ссылка на 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()

Отредактировано Edith (Июнь 30, 2017 18:26:08)

Офлайн

  • Начало
  • » GUI
  • » QVideoWidget и WA_TranslucentBackground Помогите!!![RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version