微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Qt5中子小部件的透明度

如何解决Qt5中子小部件的透明度

我将Nvidia Jetson Nano和Linux用于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,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

enter image description here

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

class MainWindow(QWidget):   
    def __init__(self):
        QWidget.__init__(self)
        self.setGeometry(50,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,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_())

enter image description here

enter image description here

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

enter image description here

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

解决方法

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

如果要设置子窗口小部件的不透明度,则需要使用QGraphicsOpacityEffect

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。