6

我有一个从 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 而导致测试应用程序崩溃。

4

3 回答 3

5

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

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

于 2011-09-28T15:55:53.943 回答
2

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

准确描述如何做到这一点对于这里的答案来说有点长。

于 2011-09-28T06:27:07.770 回答
0

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

于 2012-10-11T12:21:24.120 回答