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
相关产品推荐
相关产品推荐

