PyQt6中Qt.UserRole报错及TreeView进度条代理不显示问题求助
问题解决步骤
1. 修正枚举引用错误
PyQt6中,DisplayRole、UserRole这类数据角色枚举被归类到Qt.ItemDataRole下,直接通过Qt.UserRole访问会触发AttributeError,正确写法是Qt.ItemDataRole.UserRole。你已经完成这一步,这是解决第一个报错的关键。
2. 修复进度条不显示的核心问题
你的代码里进度条不显示主要有两个原因:
- 委托绑定到了不存在的列:你调用
setItemDelegateForColumn(1),但模型中只添加了第0列的内容(每个QStandardItem默认属于第0列),委托没作用到目标列上。 - 自定义paint方法未处理基础样式:直接绘制进度条可能会覆盖item的默认文本,或因样式冲突导致显示异常。
修改后的完整代码
import sys from PyQt6 import QtWidgets, QtGui from PyQt6.QtCore import Qt class ProgressBarDelegate(QtWidgets.QStyledItemDelegate): def paint(self, painter, option, index): # 获取进度数据,默认值避免空数据报错 progress = index.data(Qt.ItemDataRole.UserRole) or 0.0 # 先绘制父类的基础样式(保留item文本和默认背景) super().paint(painter, option, index) # 绘制进度条,留出边距避免覆盖文本 painter.save() progress_rect = option.rect.adjusted(5, 5, -5, -5) progress_rect.setWidth(int(progress_rect.width() * progress)) painter.fillRect(progress_rect, QtGui.QColor("#00c0ff")) painter.restore() class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.tree_view = QtWidgets.QTreeView(self) self.setCentralWidget(self.tree_view) self.model = QtGui.QStandardItemModel(self) self.tree_view.setModel(self.model) # 添加数据项 for i in range(10): item = QtGui.QStandardItem(f"Item {i}") progress = i / 10 # 使用正确的枚举角色存储进度数据 item.setData(progress, Qt.ItemDataRole.UserRole) self.model.appendRow(item) # 将委托绑定到实际存在的第0列 self.tree_view.setItemDelegateForColumn(0, ProgressBarDelegate(self)) app = QtWidgets.QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
关键改动说明
- 统一使用
Qt.ItemDataRole.UserRole访问数据角色,匹配PyQt6的枚举结构。 - 将委托绑定到第0列,确保作用到有数据的目标列。
- 在自定义绘制前调用父类
paint方法,保留item的默认文本显示。 - 调整进度条矩形边距,优化显示效果,避免覆盖文本内容。
内容的提问来源于stack exchange,提问作者sequence
相关产品推荐
相关产品推荐

