我目前正在开发一个使用自定义模型作为Qt模型/ View 结构扩展的应用程序。一个名为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)等,因此按相关性,日期和时间进行过滤将调用相同的函数,但具有不同的函子。
编辑:对不起,我的手机格式非常糟糕,我的手机做得很少
最佳答案
根据docs-不,不是。 filterAcceptsRow()
的目的是提供定制机制。
因此,您可以对自定义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 lambdas-将
FilterFunc
替换为std::function
,将第三个参数添加到filterAcceptsRow()
-QSortFilterProxyModel
类型的对象中,然后使用std::bind
。关于c++ - QSortFilterProxyModel::filterAcceptRows是否可自定义以接受仿函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28545633/