【发布时间】:2015-11-17 07:01:13
【问题描述】:
如何使用QSortFilterProxyModel 来过滤QTreeView 中的行而不是其子节点?
假设我要过滤第一列文本为 Mammal 的所有行,但保留子行(例如 Moose、Cat 等)
如果在示例中模型包含:
Animals
Mammals
Moose
Dog
Cat
Mouse
当应用过滤器时,视图将如下所示:
Animals
Moose
Dog
Cat
Mouse
这可以使用QSortFilterProxyModel 完成吗?如果没有,我当然愿意接受建议。但最好从我已经用于其他任务的代理中执行此操作。
【问题讨论】:
-
你可以重新实现
QSortFilterProxyModel::filterAcceptsRow来做你想做的事。不过,我不确定这是否是最简单的解决方案。 -
那么什么会成为新的父节点呢?您是否打算将子节点提升为父节点的兄弟节点?
-
过滤父节点时,节点的子节点将显示为其祖父节点的直接子节点
-
@JonHarper 我刚刚添加了一个示例。
-
过滤模型是不可能的。哺乳动物索引将被隐藏,因此它的孩子也将被隐藏!您的原始模型应该自行过滤:即它应该重新实现方法
QAbstractItemModel::parent并返回Animals作为Moose, Dog, Cat and Mouse索引的父级。当Mammals没有隐藏时,它应该将它作为这四个具体哺乳动物的父级返回。可能必须重新实现其他一些方法,但这会起作用。不要忘记发出相应的信号来通知视图一些隐藏或显示的分支,以便他们可以向您的模型询问新结构。
标签: qt qt5 qsortfilterproxymodel