如何在 pyside QWidget 中拥有透明背景,但保持其子项不透明

Posted

技术标签:

【中文标题】如何在 pyside QWidget 中拥有透明背景,但保持其子项不透明【英文标题】:How can i have a transparent background in a pyside QWidget, but keep its children opaque 【发布时间】:2017-03-20 17:22:05 【问题描述】:

我有一个包含很多孩子的小部件,我想将其背景设置为透明,但保持其孩子不透明。

我正在使用 PySide 1.2.1 win7

我尝试过这样的事情:


self.setAttribute(Qt.WA_TranslucentBackground,True);


self.setStyleSheet("background-color:rgba(40,40,150,150);border:0px;")


但它对我不起作用。它使整个小部件透明。我想让孩子们保持不透明。有人能帮我吗 ?非常感谢。这是我的代码,谢谢帮助。


import sys
from PySide.QtCore import *
from PySide.QtGui import *

class M_SCROLL_GRID_WIDGET(QWidget):
    # This is a common ui class .
    def __init__(self,column_count):
        super(M_SCROLL_GRID_WIDGET, self).__init__()

        self.column_count = column_count

        self.visible_widget_list = []

        self.scroll_widget = QWidget()

        self.scroll_area = QScrollArea()
        self.scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.scroll_area.setWidgetResizable(True)
        self.scroll_area.setWidget(self.scroll_widget)

        self.main_layout = QGridLayout()

        self.main_layout.setSpacing(0)

        self.scroll_widget.setLayout(self.main_layout)
        self.main_layout.setAlignment(Qt.AlignTop)
        master_layout = QVBoxLayout(self)
        master_layout.addWidget(self.scroll_area)

        self.setLayout(master_layout)

        self.setAttribute(Qt.WA_TranslucentBackground, True)
        self.setStyleSheet("background-color:rgba(40,40,150,150);border:0px;")


    def Get_Widget_Count(self):
        return len(self.visible_widget_list)


    def Add_Widget_To_Vis_List(self, widget):
        self.visible_widget_list.append(widget)


    def Remove_Widget_To_Vis_List(self, widget):
        self.visible_widget_list.remove(widget)


    def Remove_All_Widgets(self):
        for i in reversed(range(self.main_layout.count())):
            widget = self.main_layout.itemAt(i).widget()
            widget.setParent(None)


    def Clean_Visible_List(self):
        self.visible_widget_list = []


    def Refresh(self):

        for widget_index in xrange(len(self.visible_widget_list)):
            r_position =  widget_index      / self.column_count
            c_position = (widget_index + 1) % self.column_count
            if c_position == 0:
                c_position = self.column_count
                         self.main_layout.addWidget(self.visible_widget_list[widget_index], r_position, c_position)

if __name__ == '__main__':

    app = QApplication(sys.argv)

    caofan = M_SCROLL_GRID_WIDGET(3)

    btn_list = []

    caofan.Remove_All_Widgets()
    for a in xrange(50):
        btn = QPushButton(str(a+1))
        btn_list.append(btn)
        caofan.Add_Widget_To_Vis_List(btn)

    caofan.Refresh()

    caofan.show()

    app.exec_()

【问题讨论】:

您的示例包含太多混乱。你能删除所有不必要的东西吗?我也没有看到透明小部件。一切都是蓝色和黑色...... 【参考方案1】:

我怀疑真正的问题是您指定的样式表正在传播到子小部件。

所以,删除...

self.setStyleSheet("background-color:rgba(40,40,150,150);border:0px;")

并用类似...的东西覆盖QWidget::paintEvent

def paintEvent(self, event):
    painter = QPainter(self)
    painter.fillRect(self.rect(), QColor(40, 40, 150, 150))

【讨论】:

以上是关于如何在 pyside QWidget 中拥有透明背景,但保持其子项不透明的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PySide2 中添加边框或设置透明 QLayout?

如何使用 PythonQt 在 API 中正确关闭 QWidget 窗口

TypeError: QWebEngineView(parent: QWidget = None): 参数 1 有意外类型'PySide2.QtWidgets.QFrame'

如何检测鼠标点击在pyside中绘制的椭圆?

如何在半透明的 QWidget 上播放视频?

maya 独立与 pyside2