首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用QSortFilterProxyModel过滤仅显示子节点及其父节点的树模型?

如何使用QSortFilterProxyModel过滤仅显示子节点及其父节点的树模型?
EN

Stack Overflow用户
提问于 2011-09-27 10:12:17
回答 3查看 5.6K关注 0票数 6

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

代码语言:javascript
运行
复制
A
- B
-- C1
-- C1
-- C1
--- C2
- D
- E

我希望在节点名为== C1的情况下过滤此树,并只显示带有C1的节点及其子节点,如下所示:

代码语言:javascript
运行
复制
C1
C1
C1
- C2

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

代码语言:javascript
运行
复制
A
- B
-- C1
-- C1
-- C1
--- C2

我认为这是因为要考虑子节点,它们的父节点必须通过filterAcceptsRow()测试,对吗?我如何实现filterAcceptRows()或其他方法,使其能够完成我所描述的工作?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-28 23:55:54

好吧,我找到了解决我的问题的办法。只需使用QTreeView::setRootIndex()并将索引B作为输入参数即可。索引B成为QTreeView的根索引,它是隐藏的,并且只显示它的子项。

在找到这个解决方案后,我感觉自己真的很傻。我想我太专注于使用代理模型来修改数据的表示方式,我完全忘记了QTreeView。

票数 5
EN

Stack Overflow用户

发布于 2011-09-28 14:27:08

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-10-11 20:21:24

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7563512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档