目录
1.过滤
当我们需要检索QTableView数据时,有时候一列的过滤满足不了我们的需求,就需要自定义一个过滤类来支持多列的数据过滤,可以增加多个条件进行数据过滤,要实现这个功能,首先应该使用QTableView进行数据的展示,这样才能把我们自定义的过滤类设置给对应的Model
支持多列过滤的代码如下
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);
}
}
2.排序
有时候我们需要对表格中的数据进行多个条件排序,可以自定义过滤器,然后重写lessthan方法实现自定义排序
自定义多个条件排序方法的代码如下
bool MultipleColSortFilterProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
{
//通过当前视图中的index位置获取model中实际的数据
QVariant leftData = sourceModel()->data(source_left);
QVariant rightData = sourceModel()->data(source_right);
switch ( source_left.column() )
{
case 0 : //序号,需要判断数字
case 3 : //信号ID,需要判断数字
return leftData.toInt() < rightData.toInt();
default : //其它,只判断字符串
return leftData.toString() < rightData.toString();
}
return true;
}