c++ - "group by"代理模型

标签 c++ qt viewmodel qabstractitemmodel qsortfilterproxymodel

我有理论上无限深度的树模型和一些属性“组”。

original view

除了标准 View 之外,我还需要以这样一种方式显示此模型(并保持同步),即每个组都成为具有相同属性值的所有项目的虚拟父项。

enter image description here

使用 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/

相关文章:

c# - WPF 中的 View 和 View 模型

asp.net - 如何在 Asp.net core 中将列表从 View 发布到映射到 viewModel 的 Controller ?

c++ - Dijkstra 算法 - 如何使用优先级队列或最小堆?

c++ - 我如何知道我的编译器是否支持 XXXX C++11 功能?

c++ - 通过 eventFilter 获取 QLineEdit 的某些属性到剪贴板

windows - 构建时部署所有 Qt 依赖项

Qt自定义模型需要做什么才能启用drop?

c++ - 使用可变模板参数增强变体访问者

c# - 使用MCI从内存中播放avi流

mvvm - 从另一个页面回来后重新初始化ViewModel