如何使用QStyledItemDelegate
/QItemDelegate
永久显示复杂的小部件,即处理Qt.DisplayRole
,而不仅仅是Qt.EditRole
?
文档避免使用 paint((...但这只是复杂的方式!让我们以在QTableView
单元格内呈现QTreeView
或QTableVeiw
为例。
有QAbstractItemView.setIndexWidget()
,但这是一个坏主意,因为它只用于显示静态内容(静态模型有什么乐趣?
注意
我在另一篇文章中找到了部分答案,但这只是答案的一小部分,所以我认为它值得一篇带有适当问题的新帖子。
关键是使用QAbstractItemView.openPersistentEditor()
始终将单元格保持在编辑模式。
一些其他关键要素
- 需要为使用委托的单元格提供
Qt.EditRole
标志。 - 每当编辑器小部件的大小发生变化时,都需要调用
QStyledItemDelegate.sizeHintChanged.emit(index)
。 - 实现
QStyledItemDelegate.sizeHint()
可能既棘手又乏味(或者您可以index.internalPointer().editor_widget.sizeHint()
假设您在QStyledItemDelegate.createEditor()
期间保存了编辑器对内部指针的引用- 这里有一篇关于如何确定大小的好文章:Qt中项目视图的默认委托的机制是什么?
谨慎
应该提到的是,打开编辑器的成本很高,因此如果您有数千个索引并且它们一次全部加载,则可能需要一段时间。有许多方法可以缓解此问题:
- 使用线程增量加载模型
- 使用Qt的
fetchMore()
机制 - 增量调用
openPersistentEditor
(使用计时器,或在它们首次进入视图时( - 在展开父节点时调用
openPersistentEditor
,在折叠父节点时调用closePersistentEditor
,并可能限制在具有许多子节点上使用 expand-all。