【问题标题】:QTreeView: Filtering contents - looking for best practicesQTreeView:过滤内容——寻找最佳实践
【发布时间】:2011-10-05 04:02:06
【问题描述】:

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

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

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

1) 由于我只过滤顶级子级,因此我必须重新实现实际进行排序的任何方法,以便让所有的孙子不受影响,对吧?

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

谢谢!

【问题讨论】:

    标签: proxy filter qtreeview


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-11-30
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 2015-11-16
      • 2013-02-04
      • 1970-01-01
      • 2013-04-02
      相关资源
      最近更新 更多