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

Python 如何在样式化QFrame中设置QWidget背景的样式?,python,pyqt,pyqt5,qtstylesheets,Python,Pyqt,Pyqt5,Qtstylesheets,我有一个我想要的图像作为Qframe小部件边框的背景。我希望帧内的树边线有一个背景颜色,优先于帧图像。到目前为止,我的尝试在复选框下得到了一些区域,这些区域不是由父/子树状图设置样式的。如何使框架边框内的所有背景区域颜色相同 import PyQt5.QtGui import PyQt5.QtWidgets import PyQt5.QtCore import sys foods = [['Cookie dough', '5.2'], ['Hummus', '7.9'],

我有一个我想要的图像作为Qframe小部件边框的背景。我希望帧内的树边线有一个背景颜色,优先于帧图像。到目前为止,我的尝试在复选框下得到了一些区域,这些区域不是由父/子树状图设置样式的。如何使框架边框内的所有背景区域颜色相同

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,0)
        self.setLayout(layout)

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


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

这种情况下的解决办法是正确使用。在这个简单的例子中,类选择器就足够了(注意
QFrame
之前的时间段):

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

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


您的意思是只希望父QFrame的背景可见,而不希望树状视图的背景可见,因为树状视图有自己的颜色?您的问题还不清楚,您能把您想要的图片放进去吗get@eyllanesc请参阅更新以了解意图。干杯,谢谢音乐。有道理。很好,很容易修复。@wxecqz123不客气。请记住,如果某个答案解决了您的问题,您应该单击其左侧的灰色勾号,将其标记为已接受。
self.setStyleSheet(".QFrame {background-image: url('assets/wrap3.jpeg')}")
        palette = self.treeWidget.palette()
        palette.setColor(palette.Base, PyQt5.QtGui.QColor(24, 143, 255))
        self.treeWidget.setPalette(palette)