我有一个QTreeView,我想在其中过滤内容。我只希望在顶级子级(根索引下面的子级)上过滤这些内容。目前我通过在我的QTreeView子类中创建一个简单的过滤方法并有选择地隐藏那些不匹配的行来实现这一目的。
虽然上述方法似乎工作正常,但我想知道是否应该使用QSortFilterProxyModel重新实现它。如果是这样,有什么好处?
如果我改为使用QSortFilterProxyModel,我会有一些(希望很小)的问题:
1)因为我只过滤顶级孩子,所以我必须重新实施任何实际进行排序的方法,以便让所有的孙子独自一人,对吗?
2)我的数据模型中有许多自定义方法,负责独特的键盘导航等。我是否在代理模型中重新实现这些并让它们指向我的数据模型的方法?如果是这样,我该如何参考模型?我似乎无法找到任何可与QTreeView的model()方法相媲美的东西。
谢谢!
答案 0 :(得分:0)
使用QSortFilterProxyModel中的派生类更好。您在树视图之外保留排序的责任。
要最多重复使用现有代码,您可以像这样覆盖filterAcceptsRow
bool MySortFilterProxyModel::filterAcceptsRow(int sourceRow,
const QModelIndex &sourceParent) const
{
if( sourceParent.IsValid() ) return true; // Don't filter other than top level
return QSortFilterProxyModel( sourceRow, sourceParent );
}
对于自定义方法,您需要在代理中实现它们。然后,对于导航,您可能需要使用mapToSource和mapFromSource将代理索引转换为orignal模型索引