我有一个从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上问过这个问题,但没有得到任何有用的答复。我尝试在QSortFilterProxyModel ()中使用beginMoveRows和endMoveRows直接移动filterAcceptsRow子类的索引,但由于存在危险的const_cast,这导致测试应用程序崩溃。
发布于 2011-09-28 23:55:54
好吧,我找到了解决我的问题的办法。只需使用QTreeView::setRootIndex()并将索引B作为输入参数即可。索引B成为QTreeView的根索引,它是隐藏的,并且只显示它的子项。
在找到这个解决方案后,我感觉自己真的很傻。我想我太专注于使用代理模型来修改数据的表示方式,我完全忘记了QTreeView。
发布于 2011-09-28 14:27:08
我认为这不可能使用QSortFilterProxyModel来实现。原因是这个类只过滤元素--根据给定的条件隐藏(或不隐藏)一些元素。你想要做的是把树重新构建成一个新的树(从根-子元素的任意位置选择元素)。这只能通过创建您自己的QProxyModel后代并实现自己的树重建,并在旧树和新树之间映射索引来实现。
准确地描述如何做到这一点在这里的答案有点长。
发布于 2012-10-11 20:21:24
当然,setRootIndex是这种情况的解决方案,但如果您要寻找更复杂的模型操作,则可以考虑使用http://lynxline.com/category/models/等自定义代理模型
https://stackoverflow.com/questions/7563512
复制相似问题