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

PyQt5中如何为QTreeWidgetItem的部分文本设置红色?

解决QTreeWidgetItem部分文本变红的问题

QLabel不支持ANSI颜色转义序列(就是你用的\033[0;31m这类代码),Qt图形界面控件默认只认HTML格式的富文本,下面给你三种可行的解决方法:

方法一:用QLabel加载HTML富文本

把文本改成HTML格式,QLabel会自动解析样式,再通过setItemWidget关联到树形项:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        self.tree = QtWidgets.QTreeWidget(Form)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.tree.sizePolicy().hasHeightForWidth())
        self.tree.setSizePolicy(sizePolicy)
        self.tree.setMinimumSize(QtCore.QSize(250, 90))
        self.tree.setMaximumSize(QtCore.QSize(250, 90))        
        self.tree.setObjectName("tree")
        self.tree.header().setVisible(False)
        
        rootItem = QtWidgets.QTreeWidgetItem(self.tree)
        rootItem.setText(0, "I AM ROOT")
        
        # 改成HTML格式的富文本
        tempString = 'I AM <span style="color: red;">CHILD</span>'
        
        mixedLabel = QtWidgets.QLabel()
        # 显式开启富文本解析(默认已开启,此步可确保生效)
        mixedLabel.setTextFormat(QtCore.Qt.RichText)
        mixedLabel.setText(tempString)
                
        childItem = QtWidgets.QTreeWidgetItem(rootItem)
        self.tree.setItemWidget(childItem, 0, mixedLabel)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

方法二:直接给QTreeWidgetItem设置富文本(最简便)

其实QTreeWidgetItem本身就支持HTML富文本,不需要额外创建QLabel,直接设置文本即可:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        self.tree = QtWidgets.QTreeWidget(Form)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.tree.sizePolicy().hasHeightForWidth())
        self.tree.setSizePolicy(sizePolicy)
        self.tree.setMinimumSize(QtCore.QSize(250, 90))
        self.tree.setMaximumSize(QtCore.QSize(250, 90))        
        self.tree.setObjectName("tree")
        self.tree.header().setVisible(False)
        
        rootItem = QtWidgets.QTreeWidgetItem(self.tree)
        rootItem.setText(0, "I AM ROOT")
        
        # 直接给子项设置HTML富文本
        childItem = QtWidgets.QTreeWidgetItem(rootItem)
        childItem.setText(0, 'I AM <span style="color: red;">CHILD</span>')

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

方法三:自定义委托(复杂场景适用)

如果需要更灵活的样式控制(比如动态变色、多段不同样式文本),可以自定义QStyledItemDelegate重写绘制逻辑:

from PyQt5 import QtCore, QtGui, QtWidgets

class ColorTextDelegate(QtWidgets.QStyledItemDelegate):
    def paint(self, painter, option, index):
        text = index.data(QtCore.Qt.DisplayRole)
        if not text:
            super().paint(painter, option, index)
            return
        
        # 按需求拆分文本,这里示例拆分"I AM CHILD"为普通前缀和红色后缀
        prefix = "I AM "
        red_text = "CHILD"
        
        painter.save()
        # 绘制普通颜色的前缀
        painter.drawText(option.rect, QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter, prefix)
        # 计算红色文本的起始位置
        prefix_width = painter.fontMetrics().width(prefix)
        red_rect = option.rect.adjusted(prefix_width, 0, 0, 0)
        # 设置红色画笔
        painter.setPen(QtGui.QColor(QtCore.Qt.red))
        # 绘制红色文本
        painter.drawText(red_rect, QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter, red_text)
        painter.restore()

class Ui_Form(object):
    def setupUi(self, Form):
        self.tree = QtWidgets.QTreeWidget(Form)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.tree.sizePolicy().hasHeightForWidth())
        self.tree.setSizePolicy(sizePolicy)
        self.tree.setMinimumSize(QtCore.QSize(250, 90))
        self.tree.setMaximumSize(QtCore.QSize(250, 90))        
        self.tree.setObjectName("tree")
        self.tree.header().setVisible(False)
        
        # 给树形控件设置自定义委托
        self.tree.setItemDelegate(ColorTextDelegate())
        
        rootItem = QtWidgets.QTreeWidgetItem(self.tree)
        rootItem.setText(0, "I AM ROOT")
        
        childItem = QtWidgets.QTreeWidgetItem(rootItem)
        childItem.setText(0, "I AM CHILD")

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

补充说明

  • Qt图形界面控件只支持HTML子集的富文本,ANSI转义序列是终端控制台专用的,别用在Qt界面里。
  • 方法二是最简便的实现方式,优先推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:25:44