天天看点

QTreeView使用总结12,数据过滤,代理model,自定义过滤条件

1,简介

前文介绍了使用官方提供的代理Model进行常规数据过滤的方法。

本文继承该model,自定义一种过滤的条件,按我们特殊的要求进行过滤。

过滤条件:给定一个行数范围,只显示该范围内的数据。

2,效果

QTreeView使用总结12,数据过滤,代理model,自定义过滤条件

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);
    }
}
           

4,源码

链接:https://pan.baidu.com/s/1mWz0AaCp4AtquyqoIOnDYg

提取码:600m

网盘若失效,可在群文件下载:

群号码:1149411109 (若满加2群:917341904)

群名称:Qt实战派学习群