在QTableView中可以使用QSortFilterProxyModel来过滤model的数据,可以通过setFilterKeyColumn(int colnum)设置需要过滤的列,当设置为-1时则过滤对象为所有列,但是此种方式只要某一列中有符合条件的数据就会被显示出来
因此我们可以重写QSortFilterProxyModel的filterAcceptsRow(int source_row, const QModelIndex &source_parent)方法实现同时过滤指定多列的数据
效果如下:(源码链接在文末)
关键代码:
void MultipleColSortFilterProxyModel::setFilterKeyColumn(int column)
{
m_column = column;
QSortFilterProxyModel::setFilterKeyColumn(column);
}
void MultipleColSortFilterProxyModel::setFilterMap(QMap<int,QString> &strlist)
{
m_FilterMap = strlist;
}
bool MultipleColSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
if(m_column == -1)
{
QStringList keys;
int column_count = this->sourceModel()->columnCount(source_parent);
for(int i =0;i<column_count;i++)
{
QModelIndex index = this->sourceModel()->index(source_row,i,source_parent);
keys.push_back(this->sourceModel()->data(index).toString());
}
for(auto it = m_FilterMap.begin();it!=m_FilterMap.end();it++)
{
int col = it.key();
QString str = it.value();
if(str.isEmpty())
continue;
if(!keys.at(col).contains(str))
return false;
}
return true;
}
else
{
return QSortFilterProxyModel::filterAcceptsRow(source_row,source_parent);
}
}
使用:
m_SortModel->setFilterMap(map);
m_SortModel->setFilterKeyColumn(-1);
//map的内容 key:列号 val:过滤值