【问题标题】:Filter a parent row in a QTreeView using QSortFilterProxyModel but not children使用 QSortFilterProxyModel 过滤 QTreeView 中的父行,但不过滤子行
【发布时间】:2015-11-17 07:01:13
【问题描述】:

如何使用QSortFilterProxyModel 来过滤QTreeView 中的行而不是其子节点?

假设我要过滤第一列文本为 Mammal 的所有行,但保留子行(例如 MooseCat 等)

如果在示例中模型包含:

Animals
    Mammals
        Moose
        Dog
        Cat
        Mouse

当应用过滤器时,视图将如下所示:

Animals
    Moose
    Dog
    Cat
    Mouse

这可以使用QSortFilterProxyModel 完成吗?如果没有,我当然愿意接受建议。但最好从我已经用于其他任务的代理中执行此操作。

【问题讨论】:

  • 你可以重新实现QSortFilterProxyModel::filterAcceptsRow 来做你想做的事。不过,我不确定这是否是最简单的解决方案。
  • 那么什么会成为新的父节点呢?您是否打算将子节点提升为父节点的兄弟节点?
  • 过滤父节点时,节点的子节点将显示为其祖父节点的直接子节点
  • @JonHarper 我刚刚添加了一个示例。
  • 过滤模型是不可能的。哺乳动物索引将被隐藏,因此它的孩子也将被隐藏!您的原始模型应该自行过滤:即它应该重新实现方法QAbstractItemModel::parent 并返回Animals 作为Moose, Dog, Cat and Mouse 索引的父级。当Mammals 没有隐藏时,它应该将它作为这四个具体哺乳动物的父级返回。可能必须重新实现其他一些方法,但这会起作用。不要忘记发出相应的信号来通知视图一些隐藏或显示的分支,以便他们可以向您的模型询问新结构。

标签: qt qt5 qsortfilterproxymodel


【解决方案1】:

在文档中有一个方法QSortFilterProxyModel::mapToSource。 IMO 这是解决这个问题的最佳人选。我知道这是一个很长的镜头,但与filterAcceptsRow 结合使用它应该可以工作。

问题是它没有很好的记录。 base class QAbstractProxyModel 的文档说您必须重新实现两种方法:mapFromSourcemapToSource。 Qt 是一个开源项目,所以最好看看mapToSource 及其对应的mapFromSource。如果我有时间,我会这样做并改进这个答案。

【讨论】:

    猜你喜欢
    • 2015-06-16
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2017-01-22
    • 1970-01-01
    相关资源
    最近更新 更多