【问题标题】:Transparency for the child widget in Qt5Qt5 中子部件的透明度
【发布时间】:2021-02-17 13:52:09
【问题描述】:

我使用 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_())

[

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

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


    【解决方案1】:

    顾名思义,windowOpacity 指的是窗口的不透明度。

    如果要设置子widget的不透明度,需要使用QGraphicsOpacityEffect:

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

    【讨论】:

    • 感谢您的建议!此方法适用于常规窗口,但不适用于视频。小部件变暗,但不透明。
    • 嗯,视频叠加让事情变得更棘手。您可以尝试在样式表 (self.setStyleSheet("background-color: rgba(128, 128, 128, 128);") 中设置带有 alpha 的背景颜色,但是,即使假设它可以正确处理视频,也只会使背景半透明。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 2012-07-25
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多