qt在视图中永久显示委托

时间:2018-10-22 19:09:52

标签: qt pyqt qtableview qtreeview qabstractitemview

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

documentation不能使用paint()...但这只是复杂的方法!让我们举个例子,在QTreeView单元内渲染QTableVeiwQTableView

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

注意

我在另一个post中找到了答案的一部分,但这只是答案的一小部分,所以我认为它值得在新帖中提出适当的问题。

1 个答案:

答案 0 :(得分:2)

关键是使用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,并且可能限制在具有多个子级的节点上使用全部展开。