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