0

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

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

如果我改用 QSortFilterProxyModel,我有几个(希望很小)问题:

1)由于我只过滤顶级孩子,我将不得不重新实现实际进行排序的任何方法,这样它就可以让所有的孙子一个人呆着,对吧?

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

谢谢!

4

1 回答 1

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

于 2011-10-04T20:02:06.910 回答