2011-09-27 215 views
4

我有一个派生自QAbstractItemModel的工作树模型,我希望使用QSortFilterProxyModel子类来过滤它,以仅显示某些条件的子节点。比如我有下面的树:如何使用QSortFilterProxyModel过滤仅与父母显示子节点的树模型?

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

我想与该节点有名称的条件来过滤此树== C1和显示只有C1和他们的孩子的节点是这样的:

C1 
C1 
C1 
- C2 

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

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

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

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

+0

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

回答

4

好的,我找到了解决我的问题的方法。只要使用索引为B的QTreeView :: setRootIndex()作为输入参数。索引B成为隐藏的QTreeView的根索引,并且只显示其子项。

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

1

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

准确地描述如何做到这一点在这里有一个答案有点长。

+0

在用QSortFilterProxyModel摆弄之后,我认为你是对的。为了不显示不相关的父节点,创建我自己的QProxyModel似乎太麻烦了。我想我会活在现在有父节点​​,并且每当我重新加载我的模型时调用treeview :: expandAll(),以便立即显示所有数据。 – ksming

相关问题