1,简介
前文介绍了使用官方提供的代理Model进行常规数据过滤的方法。
本文继承该model,自定义一种过滤的条件,按我们特殊的要求进行过滤。
过滤条件:给定一个行数范围,只显示该范围内的数据。
2,效果
3,思路
写一个MyProxyModel,继承QSortFilterProxyModel 类,由于是对行进行过滤,修改 filterAcceptsRow 方法。
需要设入一个最大行和最小行,因此该派生类保存2个int成员,存该行数范围。
private:
int mMin; //最小行
int mMax; //最大行
并提供一个接口来设置范围:
void SetRange(int min,int max); //设置只显示第min行和第max行直接的数据
void MyProxyModel::SetRange(int min, int max)
{
mMin = min;
mMax = max;
invalidateFilter();
}
filterAcceptsRow 方法:
bool MyProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
if(sourceParent == QModelIndex()) //只对一级节点
{
if(RowInRange(sourceRow)) //节点是否在指定行数内
{
return true;
}
else
{
return false;
}
}
else
{
return true;
}
}
bool MyProxyModel::RowInRange(const int &row) const
{
if( mMin == 0 && mMax == 0 )
{
//未初始化过滤条件
return true;
}
if(row >= mMin && row <= mMax)
{
return true;
}
return false;
}
构造Tree的model时,这次就构造我们的代理model:
QTreeView* t = ui->treeView;
...
//4,构造代理model,设置过滤列为第2列
mProxyModel = new MyProxyModel;
mProxyModel->setSourceModel(mModel);
t->setModel(mProxyModel);
界面的“应用”按钮,从2个编辑框获取行数范围,并设给代理Model:
void MainWindow::on_btn_clicked()
{
int n1 = ui->edit1->text().toInt();
int n2 = ui->edit2->text().toInt();
if(n1 > 0 && n2 > 0)
{
int min = qMin(n1,n2);
int max = qMax(n1,n2);
mProxyModel->SetRange(min-1,max-1);
}
}