Как оформить фон QWidget в стилизованном QFrame?

У меня есть изображение, которое я хочу использовать в качестве фона границы моего виджета 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_())
        

Художественное видение выглядит так


person wxecqz123    schedule 09.04.2021    source источник
comment
Вы имеете в виду, что хотите, чтобы фон был виден только для родительского QFrame, но не для фона древовидного представления, которое будет иметь свой собственный цвет?   -  person musicamante    schedule 09.04.2021
comment
Ваш вопрос неясен, не могли бы вы выложить картинку того, что вы хотите получить   -  person eyllanesc    schedule 09.04.2021
comment
@eyllanesc см. обновление для намерения. Ваше здоровье   -  person wxecqz123    schedule 09.04.2021


Ответы (1)


Проблема в том, что QTreeWidget наследуется от QFrame (наследование QTreeWidget > QTreeView > QAbstractItemView > QAbstractScrollArea > QFrame), поэтому ваша таблица стилей фактически применяется не только к фрейму контейнера, но и к древовидному представлению.

Решение в этом случае — правильно использовать селекторы таблиц стилей. В этом простом случае будет достаточно селектора класса (обратите внимание на точку перед 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)
person musicamante    schedule 09.04.2021
comment
спасибо музыка. имеет смысл. приятно и легко исправить. - person wxecqz123; 10.04.2021
comment
@ wxecqz123 всегда пожалуйста. Помните, что если ответ решает вашу проблему, вы должны пометить его как принятый, щелкнув серую галочку слева от него. - person musicamante; 10.04.2021