You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5:设置QFrame边框背景图片并解决QTreeWidget复选框区域背景不一致问题

解决QTreeWidget空白区域背景不一致的问题

嘿,我来帮你搞定这个问题!你现在遇到的核心问题是:QTreeWidget的空白区域(比如复选框下方、Item之间的空隙)没有被设置背景色,所以透过去了父QFrame的背景图。你只给TreeWidgetItem设置了背景,但TreeWidget本身的视图区域还继承着父组件的背景,所以才会出现颜色不一致的情况。

解决方案思路

要让TreeWidget内部所有区域背景统一,需要做两件事:

  • 给QTreeWidget本身设置和Item一致的背景色,覆盖父QFrame的背景图
  • 确保Item的样式不会被默认样式干扰,保持背景色统一

修改后的完整代码

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_item = PyQt5.QtWidgets.QTreeWidgetItem([product])
            parent_item.setBackground(0, PyQt5.QtGui.QBrush(PyQt5.QtGui.QColor('#e6dddc')))
            parent_item.setFlags(parent_item.flags() | PyQt5.QtCore.Qt.ItemIsUserCheckable)
            parent_item.setTextAlignment(PyQt5.QtCore.Qt.AlignLeft, PyQt5.QtCore.Qt.AlignLeft)
            parent_item.setCheckState(0, PyQt5.QtCore.Qt.Checked)
            child_item = PyQt5.QtWidgets.QTreeWidgetItem([price])
            child_item.setBackground(0, PyQt5.QtGui.QBrush(PyQt5.QtGui.QColor('#e6dddc')))
            parent_item.addChild(child_item)
            self.addTopLevelItem(parent_item)
        
        # 关键修改:设置TreeWidget本身的背景样式
        self.setStyleSheet("""
            QTreeWidget {
                background-color: #e6dddc;
                border: none; /* 去掉默认边框,避免视觉干扰 */
            }
            /* 可选:确保Item选中/hover时也保持背景色一致(如果需要的话) */
            QTreeWidget::item:selected {
                background-color: #e6dddc;
                color: black;
            }
        """)
        
        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添加了background-color: #e6dddc;,这样TreeWidget的整个视图区域都会被这个颜色填充,包括Item之外的空白部分,彻底覆盖父QFrame的背景图
  • 加上border: none;是为了去掉TreeWidget默认的边框,让它和QFrame的边框融合得更好(如果不需要可以去掉这一行)
  • 可选的QTreeWidget::item:selected样式是为了保持选中状态下的背景色一致,避免选中时变成系统默认的蓝色(根据你的需求调整)

这样修改后,TreeWidget内部的所有区域(包括复选框下方的空白)都会和Item的背景色完全一致,不会再透出QFrame的背景图啦!

内容的提问来源于stack exchange,提问作者wxecqz123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 13:28:14