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

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/1mWz0AaCp4AtquyqoIOnDYg
提取码:600m

网盘若失效,可在群文件下载:
群号码:1149411109 (若满加2群:917341904)
群名称:Qt实战派学习群

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逆枫゛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值