如何在样式化的 QFrame 中设置 QWidget 的背景样式?
How do I style the background of QWidget in a styled QFrame?
我有一张图片我想要作为我的 Qframe 小部件边框的背景。我希望框架内的 treewidget 具有优先于框架图像的背景颜色。到目前为止,我的尝试在复选框下找到了 parent/child 树形小部件未设置样式的区域。如何使边框内的所有背景区域颜色相同?
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_())
The artistic vision looks like this
问题是 QTreeWidget 继承自 QFrame(继承是 QTreeWidget > QTreeView > QAbstractItemView > QAbstractScrollArea > QFrame),因此您的样式表实际上不仅应用于“容器”框架,还应用于树视图。
这种情况的解决方法是正确使用stylesheet selectors。在这个简单的例子中,class 选择器 就足够了(注意 QFrame
之前的句点):
self.setStyleSheet(".QFrame {background-image: url('assets/wrap3.jpeg')}")
这将确保只有 QFrame 小部件(而不是 QFrame 子classes)将具有该背景。
在树上设置背景颜色有点不同,这取决于所使用的 system/style:您可以在样式表中为 TreeWidget(您的 class)设置背景,但是这在某些情况下可能会产生一些问题,最重要的是复选框背景。
另一种方法是更改 Base
角色的调色板,这是用于项目视图背景的颜色(有时也用于实际项目背景,其他如 source他们的颜色):
palette = self.treeWidget.palette()
palette.setColor(palette.Base, PyQt5.QtGui.QColor(24, 143, 255))
self.treeWidget.setPalette(palette)
我有一张图片我想要作为我的 Qframe 小部件边框的背景。我希望框架内的 treewidget 具有优先于框架图像的背景颜色。到目前为止,我的尝试在复选框下找到了 parent/child 树形小部件未设置样式的区域。如何使边框内的所有背景区域颜色相同?
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_())
The artistic vision looks like this
问题是 QTreeWidget 继承自 QFrame(继承是 QTreeWidget > QTreeView > QAbstractItemView > QAbstractScrollArea > QFrame),因此您的样式表实际上不仅应用于“容器”框架,还应用于树视图。
这种情况的解决方法是正确使用stylesheet selectors。在这个简单的例子中,class 选择器 就足够了(注意 QFrame
之前的句点):
self.setStyleSheet(".QFrame {background-image: url('assets/wrap3.jpeg')}")
这将确保只有 QFrame 小部件(而不是 QFrame 子classes)将具有该背景。
在树上设置背景颜色有点不同,这取决于所使用的 system/style:您可以在样式表中为 TreeWidget(您的 class)设置背景,但是这在某些情况下可能会产生一些问题,最重要的是复选框背景。
另一种方法是更改 Base
角色的调色板,这是用于项目视图背景的颜色(有时也用于实际项目背景,其他如 source他们的颜色):
palette = self.treeWidget.palette()
palette.setColor(palette.Base, PyQt5.QtGui.QColor(24, 143, 255))
self.treeWidget.setPalette(palette)