QSortFilterProxyModel :: filterAcceptRows是否可以自定义以接受仿函数?

时间:2015-02-16 16:09:54

标签: c++ qt c++11

我目前正在开发一个应用程序,它使用自定义模型作为Qt模型/视图结构的扩展。一个名为MyModel的模型存储一个具有几千个元素的对象(比如std :: vector),使用标准的QTableView查看MyModel中的数据。但是,该应用程序支持对表中查看的数据进行一些简单的基本过滤,包括按相关性过滤,上传日期等等。

QSortFilterProxyModel允许基于正则表达式对模型数据进行(排序和)过滤,但不幸的是,bool filterAcceptsRow(int const&,QModelIndex const&)中定义的过滤技术不允许传递自定义函子。这个仿函数用作过滤函数,而不是在filterAcceptsRow中进行过滤。

这就是我所说的,比如想要在已经生成的乘法表(12 x 12)中找出所有偶数,目前我认为可以用QSortFilterProxyModel :: filterAcceptsRow(...)来实现

QSortFilterProxyModel::filterAcceptsRow( int source_row, ... )
{
    return sourceModel()->data( source_row ).toInt() % 2 == 0;
}

我想要的不仅仅是按偶数进行过滤,有没有办法通过将不同的仿函数传递给filterAcceptsRow(...)来进行各种过滤?像std :: sort(,, lambda_expression)或std :: for_each(,, lambda)等,以便按相关性,日期,时间过滤将调用相同的函数,但使用不同的函子。

编辑:我很抱歉格式非常糟糕,我的手机可以做的很少

1 个答案:

答案 0 :(得分:1)

根据docs - 不,不是。 filterAcceptsRow()的目的是提供自定义机制。

  

可以通过重新实现filterAcceptsRow()和filterAcceptsColumn()函数来实现自定义过滤行为。

因此,您可以实现自定义QSortFilterProxyModel,并进行一些修改,以支持filterAcceptsRow()中的仿函数。例如:

class FilterFunc
{
protected:
    const QSortFilterProxyModel * proxy_;
public:
    FilterFunc() : proxy_(0) {}
    FilterFunc(const QSortFilterProxyModel * p) : proxy_(p) {}
    bool operator()(int source_row, const QModelIndex & source_parent) {return true;}
};

class CustomSortFilterProxyModel : public QSortFilterProxyModel
{
    Q_OBJECT
    FilterFunc filter_;
protected:
    virtual bool filterAcceptsRow(int source_row, const QModelIndex & source_parent) const {
        return filter_(source_row, source_parent);
    }
public:
    void setFilter(FilterFunc f) {filter_ = f;}
};

用法:

struct CustomFilter : public FilterFunc
{
    bool operator()(int source_row, const QModelIndex & source_parent) {
        return proxy_->sourceModel()->data( source_row ).toInt() % 2 == 0;
    }
};

//...

CustomSortFilterProxyModel pm;
pm.setFilter(CustomFilter(&pm));
...
//operations that will call filterAcceptsRow()

要使用C ++ 11 lambda - 将FilterFunc替换为std::function,请将第三个参数添加到filterAcceptsRow() - QSortFilterProxyModel类型的对象中,然后使用std::bind