qt 在视图中永久显示委托
qt permanently display delegate in view
如何使用 QStyledItemDelegate
/ QItemDelegate
永久显示复杂的小部件,即处理 Qt.DisplayRole
而不仅仅是 Qt.EditRole
?
documentation 无法使用 paint()...但那只是太复杂了!让我们以在 QTableView
单元格内渲染 QTreeView
或 QTableVeiw
为例。
有 QAbstractItemView.setIndexWidget()
,但这是个坏主意,因为它只用于显示静态内容(静态模型有什么好玩的?)。
备注
我在另一个 post 中找到了部分答案,但它只是答案的一小部分,所以我认为它需要一个新的 post 和正确的问题。
关键是使用 QAbstractItemView.openPersistentEditor()
始终保持单元格处于编辑模式。
一些额外的关键要素
- 需要为使用委托的单元格提供
Qt.EditRole
标志。
QStyledItemDelegate.sizeHintChanged.emit(index)
需要在编辑器小部件的大小发生变化时调用。
- 实施
QStyledItemDelegate.sizeHint()
可能会很棘手且乏味(或者您可以 index.internalPointer().editor_widget.sizeHint()
假设您在 QStyledItemDelegate.createEditor()
期间将编辑器的引用保存到内部指针
- 这里有一个关于如何确定尺寸的好文章 post:
注意
应该提到的是,打开编辑器的成本很高,所以如果您有数千个索引并且一次加载它们,可能需要一段时间。有很多方法可以缓解此问题:
- 使用线程增量加载模型
- 使用Qt的
fetchMore()
机制
- 逐步调用
openPersistentEditor
(使用计时器,或者当它们第一次出现时)
- 在展开父级时调用
openPersistentEditor
,在折叠父级时调用 closePersistentEditor
,并可能限制在具有许多子节点的节点上使用 expand-all。
如何使用 QStyledItemDelegate
/ QItemDelegate
永久显示复杂的小部件,即处理 Qt.DisplayRole
而不仅仅是 Qt.EditRole
?
documentation 无法使用 paint()...但那只是太复杂了!让我们以在 QTableView
单元格内渲染 QTreeView
或 QTableVeiw
为例。
有 QAbstractItemView.setIndexWidget()
,但这是个坏主意,因为它只用于显示静态内容(静态模型有什么好玩的?)。
备注
我在另一个 post 中找到了部分答案,但它只是答案的一小部分,所以我认为它需要一个新的 post 和正确的问题。
关键是使用 QAbstractItemView.openPersistentEditor()
始终保持单元格处于编辑模式。
一些额外的关键要素
- 需要为使用委托的单元格提供
Qt.EditRole
标志。 QStyledItemDelegate.sizeHintChanged.emit(index)
需要在编辑器小部件的大小发生变化时调用。- 实施
QStyledItemDelegate.sizeHint()
可能会很棘手且乏味(或者您可以index.internalPointer().editor_widget.sizeHint()
假设您在QStyledItemDelegate.createEditor()
期间将编辑器的引用保存到内部指针- 这里有一个关于如何确定尺寸的好文章 post:
- 这里有一个关于如何确定尺寸的好文章 post:
注意
应该提到的是,打开编辑器的成本很高,所以如果您有数千个索引并且一次加载它们,可能需要一段时间。有很多方法可以缓解此问题:
- 使用线程增量加载模型
- 使用Qt的
fetchMore()
机制 - 逐步调用
openPersistentEditor
(使用计时器,或者当它们第一次出现时) - 在展开父级时调用
openPersistentEditor
,在折叠父级时调用closePersistentEditor
,并可能限制在具有许多子节点的节点上使用 expand-all。