"group by"代理模型
"group by" proxy model
我有理论上无限深度的树模型和一些 属性 "Group"。
除了标准视图之外,我还需要以这样的方式显示此模型(并使其保持同步),即每个组都成为具有相同 属性 值的所有项目的虚拟父项。
使用 Qt 的 model/view 架构实现此目的的最佳方法是什么?
不久前我通过在模型 adding/removing 项 to/from 上插入额外的虚拟 "groups" 解决了类似的问题,但这种方法被证明不是很灵活所以我正在寻找更好的解决方案。
理想情况下,我现在看到这是通过 QSortProxyFilter 模型实现的。
取决于你想要的最终结果:
无需实现 QAbstractProxyModel 即可实现过滤。
QSortFilterProxyModel 可以按 Item role 排序,默认为 Qt::DisplayRole。但是如果你把你的组 属性 放在你的项目的自定义角色中,那么你可以按这个自定义角色排序:cf:
https://doc.qt.io/qt-5/qsortfilterproxymodel.html#sortRole-prop
这应该完成按组排序的特定视图的主要排序工作。
但是您不会有 "collapsable group" 节点。很难说您是否可以使用自定义渲染器管理等效功能。
否则,按照 Felix 的建议,困难的方法是实现将创建节点组索引的自定义 QAbstractProxyModel。
最后一个解决方案:创建您自己的(基本)模型(类似于 MyTree 和 Map<Group,Node>
以及两个 Qt 模型(每个视图一个))。当您的基础模型更新时,通过 Qt 的 signal/slot 机制更新两个模型,反之亦然。
我有理论上无限深度的树模型和一些 属性 "Group"。
除了标准视图之外,我还需要以这样的方式显示此模型(并使其保持同步),即每个组都成为具有相同 属性 值的所有项目的虚拟父项。
使用 Qt 的 model/view 架构实现此目的的最佳方法是什么?
不久前我通过在模型 adding/removing 项 to/from 上插入额外的虚拟 "groups" 解决了类似的问题,但这种方法被证明不是很灵活所以我正在寻找更好的解决方案。
理想情况下,我现在看到这是通过 QSortProxyFilter 模型实现的。
取决于你想要的最终结果:
无需实现 QAbstractProxyModel 即可实现过滤。
QSortFilterProxyModel 可以按 Item role 排序,默认为 Qt::DisplayRole。但是如果你把你的组 属性 放在你的项目的自定义角色中,那么你可以按这个自定义角色排序:cf: https://doc.qt.io/qt-5/qsortfilterproxymodel.html#sortRole-prop
这应该完成按组排序的特定视图的主要排序工作。
但是您不会有 "collapsable group" 节点。很难说您是否可以使用自定义渲染器管理等效功能。
否则,按照 Felix 的建议,困难的方法是实现将创建节点组索引的自定义 QAbstractProxyModel。
最后一个解决方案:创建您自己的(基本)模型(类似于 MyTree 和
Map<Group,Node>
以及两个 Qt 模型(每个视图一个))。当您的基础模型更新时,通过 Qt 的 signal/slot 机制更新两个模型,反之亦然。