逆枫゛

Qt学习群:1149411109 群文件提供博客源码,定期答疑、更新学习资料。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

4,源码

https://pan.baidu.com/s/1u36vTiuQZfh0a1ByMtluDg

posted on 2018-05-20 17:52  逆枫゛  阅读(562)  评论(0编辑  收藏  举报