Qt5 中子部件的透明度

问题描述 投票:0回答:3

我使用 Nvidia Jetson Nano 和 Linux for Tegra(Ubuntu 18、X11 窗口系统)、Python 3.6 和 PyQt5。我想在主小部件上放置一个透明小部件(或具有透明背景)。

当这些小部件被创建为独立时,所有内容都会正确显示。即使 gstreamer 视频流显示在主小部件中,透明度也会起作用。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MainWindow(QWidget):   
    def __init__(self):
        QWidget.__init__(self)
        self.setGeometry(50,50,320,240)
        self.setWindowTitle("Main Window")
        self.setStyleSheet("background-color:yellow;")
        self.label = QLabel(self)
        self.label.setText("Main Widget")
        self.menu = MenuWidget()
    
class MenuWidget(QWidget):
    def __init__(self): 
        QWidget.__init__(self)
        self.setWindowFlags(Qt.Tool)
        self.setGeometry(100,100,100,50)
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setStyleSheet("background-color:gray;")
        self.setWindowOpacity(0.5)
        self.label = QLabel(self)
        self.label.setText("Menu Widget")

app = QApplication([])
window = MainWindow()
window.show()
window.menu.show()
sys.exit(app.exec_())

[enter image description here

当我尝试创建一个小部件作为主小部件的子部件时,透明度不起作用。如果显示视频,主窗口小部件窗口中会出现一个“洞”。

class MainWindow(QWidget):   
    def __init__(self):
        QWidget.__init__(self)
        self.setGeometry(50,50,320,240)
        self.setWindowTitle("Main Window")
        self.setStyleSheet("background-color:yellow;")
        self.label = QLabel(self)
        self.label.setText("Main Widget")
        self.menu = MenuWidget(parent=self)
        print('main window created')
    
class MenuWidget(QWidget):
    def __init__(self, parent): 
        QWidget.__init__(self, parent)
        self.setWindowFlags(Qt.Tool)
        self.setGeometry(100,100,100,50)
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setStyleSheet("background-color:gray;")
        self.setWindowOpacity(0.5)
        self.label = QLabel(self)
        self.label.setText("Menu Widget")

app = QApplication([])
window = MainWindow()
window.show()
sys.exit(app.exec_())

此外,如果我为子窗口小部件设置属性 self.setAttribute(Qt.WA_TranslucentBackground),主窗口中会出现一个“洞”(如果视频正在该窗口中播放)。

如何为子部件设置透明度?预先感谢您的回答!

python pyqt qt5 nvidia-jetson
3个回答
1
投票

顾名思义,

windowOpacity
指的是窗口的不透明度。

如果要设置子控件的不透明度,则需要使用QGraphicsOpacityEffect

class MenuWidget(QWidget):
    def __init__(self, parent): 
        QWidget.__init__(self, parent)
        # ...
        self.setGraphicsEffect(QGraphicsOpacityEffect(opacity=.5))

0
投票

据我了解,小部件的透明度(背景透明度)只能使用桌面合成器创建。 Qt 无法使用桌面合成器来渲染子部件。唯一的解决方案是使用独立的窗口/小部件。唯一的解决方案是使用独立的窗口/小部件。


0
投票

同样的问题!当我设置子窗口小部件的父级时,透明失败。 针对这种情况有什么好的解决办法吗?

© www.soinside.com 2019 - 2024. All rights reserved.