【问题标题】:How to use QSortFilterProxyModel to filter a tree model that only display children nodes with their parents?如何使用 QSortFilterProxyModel 过滤仅显示子节点及其父节点的树模型?
【发布时间】:2013-10-21 17:42:32
【问题描述】:

我有一个从 QAbstractItemModel 派生的工作树模型,我希望使用 QSortFilterProxyModel 子类对其进行过滤,以仅显示特定条件的子节点。例如我有以下树:

A
- B
-- C1
-- C1
-- C1
--- C2
- D
- E

我想过滤这棵树,条件是节点的名称 == C1,并只显示具有 C1 的节点及其子节点,如下所示:

C1
C1
C1
- C2

我已经有一个重新实现了 filterAcceptsRow() 的子类,它可以部分做我想要的,但它仍然会显示 C1 节点的父节点和祖父节点:

A
- B
-- C1
-- C1
-- C1
--- C2

我认为这是因为要考虑子节点,它们的父节点必须通过 filterAcceptsRow() 测试,对吗?我怎样才能实现 filterAcceptRows() 或其他方法,以便它可以做我所描述的?

我曾经在 qtcentre 和 qtforum 上问过这个问题,但没有得到任何有用的答复。我尝试使用 filterAcceptsRow() 中的 beginMoveRows 和 endMoveRows 直接移动 QSortFilterProxyModel 子类的索引,但这只是由于危险的 const_cast 而导致测试应用程序崩溃。

【问题讨论】:

  • 哇!真的没有人能回答这个问题吗?

标签: c++ qt model qtreeview


【解决方案1】:

好的,我找到了解决问题的方法。只需使用带有索引 B 的 QTreeView::setRootIndex() 作为输入参数。索引 B 成为 QTreeView 的根索引,它是隐藏的,只有它的子节点才会完整显示。

找到这个解决方案后,我感到非常愚蠢。我想我太专注于使用代理模型来修改数据的呈现方式,我完全忘记了 QTreeView。

【讨论】:

    【解决方案2】:

    我认为使用 QSortFilterProxyModel 是不可能实现的。原因是这个类只过滤元素——它根据给定的标准隐藏(或不隐藏)一些元素。你想要做的是将树重组为新的(从根子的任意位置选择元素)。这只能通过创建自己的 QProxyModel 后代并实现自己的树重建以及在新旧树之间映射索引来实现。

    准确描述如何做到这一点,这里的答案有点长。

    【讨论】:

    • 在摆弄了 QSortFilterProxyModel 之后,我认为你是对的。创建我自己的 QProxyModel 只是为了不显示不相关的父节点似乎太麻烦了。我想我现在可以忍受父节点的存在,并在我重新加载模型时调用 treeview::expandAll() 以便立即显示所有数据。
    【解决方案3】:

    当然 setRootIndex 是这种情况的解决方案,但如果您要寻找更复杂的模型操作,您可以考虑使用自定义代理模型,如 http://lynxline.com/category/models/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      相关资源
      最近更新 更多