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

如何在样式化的 QFrame 中设置 QWidget 的背景样式?

如何解决如何在样式化的 QFrame 中设置 QWidget 的背景样式?

我有一张我想要的图像作为 qframe 小部件边框的背景。我希望框架内的 treewidget 具有优先于框架图像的背景颜色。到目前为止,我的尝试在复选框下有一些区域,这些区域不是由父/子 treewidgetitems 设计的。如何使框架边框内的所有背景区域颜色相同?

Attempt so far pic

import PyQt5.QtGui
import PyQt5.QtWidgets
import PyQt5.QtCore

import sys

foods = [['Cookie dough','5.2'],['Hummus','7.9'],['Spaghetti','9.92'],['Dal makhani','4.2'],['Chocolate whipped cream','1.2']]

class TreeWidget(PyQt5.QtWidgets.QTreeWidget):
    def __init__(self,parent = None):
        super().__init__(parent)
        
    
        for product,price in foods:
            parent = PyQt5.QtWidgets.QTreeWidgetItem([product])
            parent.setBackground(0,PyQt5.QtGui.QBrush(PyQt5.QtGui.QColor('#e6dddc')))
            parent.setFlags(parent.flags() | PyQt5.QtCore.Qt.ItemIsUserCheckable)
            parent.setTextAlignment(PyQt5.QtCore.Qt.AlignLeft,PyQt5.QtCore.Qt.AlignLeft)
            check_state = PyQt5.QtCore.Qt.Checked
            parent.setCheckState(0,check_state)
            
            child = PyQt5.QtWidgets.QTreeWidgetItem([price])
            child.setBackground(0,PyQt5.QtGui.QBrush(PyQt5.QtGui.QColor('#e6dddc')))
            parent.addChild(child)
            
            self.addTopLevelItem(parent)
            
        self.setRootIsDecorated(False)
        self.setHeaderHidden(True)
        self.expandAll()
        
        
class Section(PyQt5.QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setStyleSheet("qframe {background-image: url('assets/wrap3.jpeg')}")
        
        layout = PyQt5.QtWidgets.qgridLayout()
        
        self.treeWidget = TreeWidget()
        
        self.frame = PyQt5.QtWidgets.qframe()
        self.frame.setFrameShape(PyQt5.QtWidgets.qframe.StyledPanel)
        self.frame.setFrameShadow(PyQt5.QtWidgets.qframe.Raised)
        tree_layout = PyQt5.QtWidgets.QVBoxLayout(self.frame)
        tree_layout.addWidget(self.treeWidget)

        layout.addWidget(self.frame,0)
        self.setLayout(layout)

            
        
if __name__ == '__main__':
    app = PyQt5.QtWidgets.QApplication(sys.argv)
    window = Section()
    window.show()
    sys.exit(app.exec_())
        

The artistic vision looks like this

解决方法

问题是 QTreeWidget 继承自 QFrame(继承是 QTreeWidget > QTreeView > QAbstractItemView > QAbstractScrollArea > QFrame),因此您的样式表实际上不仅应用于“容器”框架,还应用于树视图。>

这种情况下的解决方案是正确使用stylesheet selectors。在这个简单的例子中,类选择器就足够了(注意 QFrame 之前的句点):

self.setStyleSheet(".QFrame {background-image: url('assets/wrap3.jpeg')}")

这将确保只有 QFrame 小部件(而不是 QFrame 子类)具有该背景。

在树上设置背景颜色有点不同,这取决于使用的系统/样式:您可以在样式表中为 TreeWidget(您的类)设置背景,但这在某些情况下可能会产生一些问题,最重要的是复选框背景。
另一种方法是更改​​ Base 角色的调色板,它是用于项目视图背景的颜色(有时也用于实际项目背景,其他用作颜色):

        palette = self.treeWidget.palette()
        palette.setColor(palette.Base,PyQt5.QtGui.QColor(24,143,255))
        self.treeWidget.setPalette(palette)

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