在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:过滤值
源码链接

















