首页 > 解决方案 > qt 在视图中永久显示委托

问题描述

您如何使用QStyledItemDelegate/QItemDelegate永久显示复杂的小部件,即处理Qt.DisplayRole,而不仅仅是Qt.EditRole

文档没有使用paint() ......但这只是复杂的方式!让我们以渲染单元格内部QTreeViewQTableVeiw内部为例QTableView

QAbstractItemView.setIndexWidget(),但这是一个坏主意,因为它仅用于显示静态内容(静态模型有什么乐趣?)。

笔记

我在另一个帖子中找到了部分答案,但这只是答案的一小部分,所以我认为有必要发布一个带有适当问题的新帖子。

标签: qtpyqtqtableviewqtreeviewqabstractitemview

解决方案


关键是用于QAbstractItemView.openPersistentEditor()始终保持单元格处于编辑模式。

一些额外的关键元素

  1. Qt.EditRole需要为使用委托的单元格提供标志。
  2. QStyledItemDelegate.sizeHintChanged.emit(index)需要在编辑器小部件的大小发生变化时调用。
  3. 实现QStyledItemDelegate.sizeHint()可能很棘手且乏味(或者您可以index.internalPointer().editor_widget.sizeHint()假设您在QStyledItemDelegate.createEditor()

警告

应该提到的是,打开编辑器的成本很高,因此如果您有数千个索引并且它们都一次加载,则可能需要一段时间。有很多方法可以缓解这个问题:

  1. 使用线程增量加载模型
  2. 使用Qt的fetchMore()机制
  3. 增量调用openPersistentEditor(使用计时器,或者当它们第一次出现时)
  4. openPersistentEditor在父级展开和父级折叠时调用closePersistentEditor,并可能限制在具有许多子节点的节点上使用 expand-all。

推荐阅读