代码之家  ›  专栏  ›  技术社区  ›  rsht

“分组依据”代理模型

  •  3
  • rsht  · 技术社区  · 7 年前

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

    original view

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

    enter image description here

    使用Qt的模型/视图体系结构实现这一点的最佳方法是什么?

    不久前,我通过在模型中添加/删除项目时插入额外的虚拟“组”解决了类似的问题,但这种方法被证明不是很灵活,所以我正在寻找更好的解决方案。

    理想情况下,目前我认为这是通过QSortProxyFilter模型实现的。

    1 回复  |  直到 7 年前
        1
  •  1
  •   sandwood    7 年前

    取决于最终结果:

    • 无需实现QAbstractProxyModel即可实现过滤。

      QSortFilterProxy模型可以按项角色进行排序,默认为Qt::DisplayRole。但如果将组属性置于项目的自定义角色中,则可以按此自定义角色排序:cf: https://doc.qt.io/qt-5/qsortfilterproxymodel.html#sortRole-prop

      这应该完成按组排序的特定视图排序的主要工作。

      但您没有“可折叠组”节点。很难说您是否可以使用自定义渲染器来管理等效功能。

    • 否则,按照Felix的建议,很难实现将创建节点组索引的自定义QAbstractProxyModel。

    • 最后一个解决方案:创建自己的(基本)模型(类似于MyTree和 Map<Group,Node> ,和两个Qt模型(每个视图一个)。当基础模型更新时,通过Qt的信号/插槽机制更新两个模型,反之亦然。