qt 在视图中永久显示委托

qt permanently display delegate in view

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

documentation 无法使用 paint()...但那只是太复杂了!让我们以在 QTableView 单元格内渲染 QTreeViewQTableVeiw 为例。

QAbstractItemView.setIndexWidget(),但这是个坏主意,因为它只用于显示静态内容(静态模型有什么好玩的?)。

备注

我在另一个 post 中找到了部分答案,但它只是答案的一小部分,所以我认为它需要一个新的 post 和正确的问题。

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

一些额外的关键要素

  1. 需要为使用委托的单元格提供 Qt.EditRole 标志。
  2. QStyledItemDelegate.sizeHintChanged.emit(index) 需要在编辑器小部件的大小发生变化时调用。
  3. 实施 QStyledItemDelegate.sizeHint() 可能会很棘手且乏味(或者您可以 index.internalPointer().editor_widget.sizeHint() 假设您在 QStyledItemDelegate.createEditor() 期间将编辑器的引用保存到内部指针
    • 这里有一个关于如何确定尺寸的好文章 post:

注意

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

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