"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 机制更新两个模型,反之亦然。