我有一个从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而导致测试应用程序崩溃。
答案 0 :(得分:4)
好的,我找到了解决问题的方法。只需使用带索引B的QTreeView :: setRootIndex()作为输入参数。索引B成为QTreeView的根索引,该索引是隐藏的,只有其子项完整显示。
找到这个解决方案后,我感到非常愚蠢。我猜我太专注于使用代理模型来修改数据的呈现方式,我完全忘记了QTreeView。答案 1 :(得分:1)
我不认为使用QSortFilterProxyModel可以实现这一点。原因是这个类只过滤元素 - 根据给定的标准,它隐藏(或不隐藏)某些元素。你想要做的是将树重组为新的树(从根孩子的任意位置选择元素)。这只能通过创建自己的QProxyModel后代并实现自己的树重建,以及在新旧树之间映射索引来实现。
在这里详细描述如何做到这一点有点长。
答案 2 :(得分:0)
当然setRootIndex是这种情况的解决方案,但如果您要寻找更复杂的模型操作,您可以考虑使用自定义代理模型,如http://lynxline.com/category/models/