pyqt 在视图中永久显示委托



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

文档避免使用 paint((...但这只是复杂的方式!让我们以在QTableView单元格内呈现QTreeViewQTableVeiw为例。

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

注意

我在另一篇文章中找到了部分答案,但这只是答案的一小部分,所以我认为它值得一篇带有适当问题的新帖子。

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

一些其他关键要素

  1. 需要为使用委托的单元格提供Qt.EditRole标志。
  2. 每当编辑器小部件的大小发生变化时,都需要调用QStyledItemDelegate.sizeHintChanged.emit(index)
  3. 实现QStyledItemDelegate.sizeHint()可能既棘手又乏味(或者您可以index.internalPointer().editor_widget.sizeHint()假设您在QStyledItemDelegate.createEditor()期间保存了编辑器对内部指针的引用
    • 这里有一篇关于如何确定大小的好文章:Qt中项目视图的默认委托的机制是什么?

谨慎

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

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

相关内容

  • 没有找到相关文章

最新更新