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实战派学习群

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: QTreeView是Qt中的一个控件,用于显示树形结构的数据。而自定义Model是指用户可以自己编写一个继承自QAbstractItemModel的类,用于管理数据,并提供给QTreeView显示。 通过自定义Model,用户可以更加灵活地管理数据,并且可以根据自己的需求定制数据的显示方式。同时,自定义Model也可以实现一些高级功能,比如数据过滤、排序等。 在使用QTreeView时,通常需要先创建一个自定义Model,并将其设置为QTreeViewModel。然后,通过实现自定义Model中的一些方法,比如rowCount()、columnCount()、data()等,来管理和显示数据。最后,将QTreeView添加到窗口中,即可显示树形结构的数据。 ### 回答2: QTreeView是Qt中的一个控件,用于显示树形结构的数据,同时支持对树形数据的展开和收起、排序、拖放等操作。而自定义model则是指在QTreeView使用自定义数据模型(比如继承自QAbstractItemModel),以便更好地满足特定需求,如多层次结构的数据展示、自定义的排序和筛选规则等,从而提高应用的灵活性和可扩展性。 使用QTreeView自定义model的基本步骤如下: 1.创建QTreeView控件,并设置其父控件。 2.创建自定义model,继承自QAbstractItemModel,并实现其纯虚函数(data、index、parent等)。 3.将自定义model关联到QTreeView中,使用setModel函数来完成,如“treeview->setModel(model)”。 4.在自定义model中重写headerData函数,以便支持表头的显示和自定义表头的内容。 5.在自定义model中实现rowCount、columnCount等函数,以便返回数据的行数和列数。 6.在自定义model中实现data函数,以便为每个单元格提供数据,并支持必要的自定义颜色、字体等操作。 7.在自定义model中实现index、parent等函数,以便能够正确的根据数据的层级关系建立树形结构。 8.在需要进行操作(如排序、拖放、展开等)时,通过对model的接口进行调用,来实现对数据的控制和修改。 总之,使用QTreeView自定义model可以方便地展示树形结构的数据,同时允许对数据进行更加灵活的控制和操作。对于复杂的数据结构和类型,使用自定义model来更好地满足需求,并提高应用的易用性和可扩展性。 ### 回答3: QTreeView 是 PyQt5 中的一个控件,它用于显示数据列表。而自定义 model 则是 QTreeView 显示数据的一种方式。 QTreeView 默认使用的是 QModelIndexes 来获取数据。但是如果需要显示特殊形式的数据,如树形结构、自定义数据类型等,则需要自定义 model数据进行处理。 自定义 model 需要继承 QAbstractItemModel 这个类,并实现它的一些虚函数,比如 rowCount()、columnCount()、index()、parent()、data() 等。这些函数的主要作用是处理数据的存储和获取、节点的定位、节点的展开和收起、数据的显示等功能。自定义 model 真正的作用是将外部数据源与 QTreeView 相关联,使其能够展示外部数据。 在自定义 model 的过程中,最重要的一步是实现数据存储和管理的功能。这通常包括两个方面,一是对数据进行存储和索引,二是对数据进行增删改查的操作。数据存储和索引可以使用 PyQt5 中提供的数据结构,如 QHash、QList 等。数据操作可以通过实现一些特定的函数,比如 insertRows()、removeRows()、setData() 等。这些函数在 QTreeView 中调用后,将会更新数据,并刷新界面。 在使用自定义 model 的时候,需要将该 modelQTreeView 相关联,方法是将 model 实例设置给 QTreeView 控件的 setModel() 函数。此时,QTreeView 将会使用model 实例来显示数据。 总之,使用自定义 model ,可以灵活、方便地处理 QTreeView 中的数据,并将不同类型的数据展示出来。 但是创建一个有效的自定义 model 是一项有挑战性的任务,需要深入了解 QAbstractItemModel 的工作方式、各种函数的功能以及如何在大量数据下快速动态更新界面等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

逆枫゛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值