Proxy QTreeView:筛选内容-寻找最佳实践

Proxy QTreeView:筛选内容-寻找最佳实践,proxy,filter,qtreeview,Proxy,Filter,Qtreeview,我有一个QTreeView,希望在其中过滤内容。我只希望在顶级子级(根索引下的子级)上过滤这些内容。目前,我通过在我的QTreeView子类中创建一个简单的过滤方法并有选择地隐藏那些不匹配的行来实现这一点 虽然上述方法似乎很好,但我想知道是否应该使用QSortFilterProxyModel重新实现它。如果是,有什么好处 如果我改为使用QSortFilterProxy模型,我有几个问题(希望是小问题): 1) 因为我只对顶级子级进行筛选,所以我必须重新实现实际执行排序的任何方法,这样就可以让所有

我有一个QTreeView,希望在其中过滤内容。我只希望在顶级子级(根索引下的子级)上过滤这些内容。目前,我通过在我的QTreeView子类中创建一个简单的过滤方法并有选择地隐藏那些不匹配的行来实现这一点

虽然上述方法似乎很好,但我想知道是否应该使用QSortFilterProxyModel重新实现它。如果是,有什么好处

如果我改为使用QSortFilterProxy模型,我有几个问题(希望是小问题):

1) 因为我只对顶级子级进行筛选,所以我必须重新实现实际执行排序的任何方法,这样就可以让所有的子级都单独进行筛选,对吗

2) 我的数据模型中有许多自定义方法,它们负责独特的键盘导航等。我是否在代理模型中重新实现了这些,并让它们指向我的数据模型的方法?如果是,我如何参考模型?我似乎找不到任何东西可以与QTreeView的model()方法相比


谢谢

使用来自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将代理索引转换为原始模型索引