qt - qt 在视图中永久显示委托
问题描述
您如何使用QStyledItemDelegate
/QItemDelegate
永久显示复杂的小部件,即处理Qt.DisplayRole
,而不仅仅是Qt.EditRole
?
文档没有使用paint() ......但这只是复杂的方式!让我们以渲染单元格内部QTreeView
或QTableVeiw
内部为例QTableView
。
有QAbstractItemView.setIndexWidget()
,但这是一个坏主意,因为它仅用于显示静态内容(静态模型有什么乐趣?)。
笔记
我在另一个帖子中找到了部分答案,但这只是答案的一小部分,所以我认为有必要发布一个带有适当问题的新帖子。
解决方案
关键是用于QAbstractItemView.openPersistentEditor()
始终保持单元格处于编辑模式。
一些额外的关键元素
Qt.EditRole
需要为使用委托的单元格提供标志。QStyledItemDelegate.sizeHintChanged.emit(index)
需要在编辑器小部件的大小发生变化时调用。- 实现
QStyledItemDelegate.sizeHint()
可能很棘手且乏味(或者您可以index.internalPointer().editor_widget.sizeHint()
假设您在QStyledItemDelegate.createEditor()
- 这是一篇关于如何确定大小的好帖子:Qt 中项目视图的默认委托的机制是什么?
警告
应该提到的是,打开编辑器的成本很高,因此如果您有数千个索引并且它们都一次加载,则可能需要一段时间。有很多方法可以缓解这个问题:
- 使用线程增量加载模型
- 使用Qt的
fetchMore()
机制 - 增量调用
openPersistentEditor
(使用计时器,或者当它们第一次出现时) openPersistentEditor
在父级展开和父级折叠时调用closePersistentEditor
,并可能限制在具有许多子节点的节点上使用 expand-all。
推荐阅读
- c# - c# Finishing a BPF(Business Process Flow)
- html - 如何将图像放在 Matlab uicontrol 按钮上?
- python - 在 Python Pandas 中派生新列时出现 ValueError
- http - 如何在 Flutter/Dart http Request 对象上设置标头?
- php - 如何更新列而不是向其添加另一个值?
- java - 如何跳过 Salesforce 的登录页面?
- apache - Laravel Valet 与 Apache + dnsmasq
- xamarin.forms - 命名字体大小的 Xamarin 表单辅助功能缩放
- r - 如何有效地在 R data.table 中找到具有非零值的最后一行
- assembly - 将汇编代码转换为机器代码。这个电脑柜台里有什么?