QTreeView 自定义model:大数据量显示 -- 性能和内存的优化

本文介绍了在Qt中使用自定义model来处理大数据量显示时的性能和内存优化。通过对比QStandardItemModel,展示了自定义model如何减少内存开销,并通过实例解释了如何构建和实现自定义的TreeModel,以及如何通过实时计算减少存储的数据量,从而提高应用程序的效率。
摘要由CSDN通过智能技术生成

简述

前面简单介绍过Qt的模型/视图框架,提到了Qt预定义的几个model类型:
QStringListModel:存储简单的字符串列表
QStandardItemModel:可以用于树结构的存储,提供了层次数据
QFileSystemModel:本地系统的文件和目录信息
QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel:存取数据库数据

一般情况下满足需求了,不过有时候需要一些定制功能,或者是大量数据下对性能和开销比较注重,觉得自带的model无用功能太多效率比较低,这时候自定义model就比较适合了。
我使用自定义model 同时出于这两方面需要,既为了性能也为了特殊功能。

参考资料

豆子《Qt学习之路2》中的几篇关于自定义model的文章:

  • 自定义model之一: 自定义只读模型
  • 自定义model之二: 自定义可编辑模型
  • 自定义model之三: 布尔表达式树模型

效果

本篇文章写的费了点功夫,为了演示本章内容,花了几个小时的时间整理代码和示例。
因为技术都应用在我的项目里,实际所用的model实现了很多特殊功能,非常复杂,我要提炼出一个简单可读的demo。

如图,分别演示了以常规的 QStandardItemModel 和使用自定义的model的效果。
示例中只使用了10W行的数据量级
运行程序你就会发现,常规model在初始化tree的过程就比自定义model慢很多,更可怕的是,它所占用的内存开销是自定义model的数倍甚至数十倍!数据量越大内存差距越明显。
QTreeView 自定义model:大数据量显示 -- 性能和内存的优化

这里以10个一级节点班级,每个班级1W个学生,共10W条记录的数据量测试:
QStandardItemModel 方法程序占用总内存大概160多M,而自定义model 占用的30多M。
而Qt一个简单窗口程序本身有20多M内存。
可见自定义model显示这10W条记录基本没使用多少内存,如果考虑百万、千万级别的数据,不使用自定义model或比较有效的优化方法,内存将很快耗尽。

构造演示数据

我演示的例子为一级节点班级、二级节点学生信息。

其中学生信息原始数据只有姓名、三门课成绩,需显示的列多一些,包含:
班级/姓名、语文、数学、外语、总分、平均分、是否合格、是否评优

其中后面几列是根据学生成绩计算得出的:
所有课成绩都>60则合格,所有课成绩都>90则优秀。

定义数据类型:班级、学生

//学生信息
typedef struct _STUDENT{
    QString name;   //姓名
    int score1;     //语文成绩
    int score2;     //数学成绩
    int score3;     //外语成绩
    _STUDENT()
    {
        name = "";
        score1 = score2 = score3 = 0;
    }
}STUDENT,*PSTUDENT;

//班级信息
typedef struct _CLASS{
    QString name;   //班级
    QVector<STUDENT*> students;
    _CLASS()
    {
        name = "";
    }
}CLASS;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //初始化模拟数据:学生成绩
    //10个班级、每个班级10000个学生,共10W行记录
    int nClass = 10;
    int nStudent = 10000;
    for(int i=0;i<
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QTreeView是Qt框架中的一个控件,用于显示树形结构的数据。在使用QTreeView时,可以选择使用默认的QStandardItemModel作为Model,也可以自定义Model自定义Model需要继承自QAbstractItemModel,并实现其虚函数。对于树形结构的数据,可以通过创建自定义的TreeItem类来表示树中的每一个节点。 TreeItem类需要包含节点的数据和对子节点的操作。在TreeItem类中,可以定义成员变来保存节点的数据,如名称、值等等。对于父节点和子节点之间的关系,则可以使用指针或引用来实现。 在自定义Model中,需要实现QAbstractItemModel的虚函数,如rowCount、columnCount、data等。这些函数决定了树形结构的样式和节点数据的展示。 在创建自定义Model时,需要在构造函数中创建根节点,并将根节点的指针传入TreeItem类的构造函数中。然后,通过添加子节点的方式来构建整个树形结构。 在data函数中,可以根据index的参数判断节点的类型。如果是根节点,返回根节点的数据;如果是其他节点,返回具体节点的数据。 根据自定义Model,可以在QTreeView中使用setModel函数来设置数据源。然后通过QTreeView的展开、收缩功能,可以选择性地显示或隐藏子节点。 使用自定义Model和TreeItem类,可以更灵活地控制树形结构数据的展示,包括节点的样式和数据的显示。同时,还可以方便地对节点的操作进行封装,实现更复杂的功能,如节点的增删改查等。 ### 回答2: QTreeView是Qt中常用的树形视图控件,我们可以使用自定义Model和TreeItem来实现个性化的树形结构。 首先,我们需要创建一个自定义Model类,继承自QAbstractItemModel。在这个类中,我们需要重写一些必要的虚函数来提供数据,并定义对树形结构的修改操作。其中,最重要的是重写index、parent、rowCount和columnCount函数。 在Model类中,我们还需要创建一个自定义的TreeItem类,用于表示树形结构中的每个节点。TreeItem类中应该包含一些成员变,如数据、父节点和子节点列表。我们可以在TreeItem类中定义一些函数用于获取、设置和操作这些成员变。 当Model类和TreeItem类创建好之后,我们就可以在Model类中实现一些函数,如setData、insertItem和removeItem来对树形结构进行修改。在这些函数内部,我们可以调用TreeItem类中的函数来操作具体的节点。 随后,在主程序中,我们创建一个QTreeView控件,并通过setModel方法设置我们自定义Model。可以通过调用Model类中的函数,如insertItem和removeItem来添加和删除树形结构中的节点。 通过以上步骤,我们就可以实现对QTreeView自定义Model和TreeItem的使用了。在这个过程中,我们可以根据实际需求,对Model和TreeItem类进行扩展,以满足更加复杂的功能要求。 ### 回答3: QTreeView是Qt框架中的一个控件,用于显示树形结构的数据。自定义Model和TreeItem可以使我们能够更灵活地操作和显示树形数据。 首先,我们需要自定义一个Model类,继承自QAbstractItemModel。在这个类中,我们需要实现一些虚函数,如index()、parent()、rowCount()、columnCount()、data()等,用于提供数据和索引。 接下来,我们需要自定义一个TreeItem类,用于存储每一个树节点的数据。在这个类中,我们需要定义一些成员变,如节点数据、节点在父节点的位置、指向子节点和父节点的指针等。同时,我们还需要实现一些函数,如获取子节点个数、获取指定位置的子节点、获取父节点等。 然后,我们在Model类中创建一个根节点,并设置相关属性。我们可以通过添加子节点和设置树节点的数据,构建整个树形结构。 最后,在使用QTreeView时,我们需要通过setModel()函数将自定义Model设置给QTreeView。通过这个ModelQTreeView就能够获取到我们提供的数据,并将其显示出来。 总结起来,自定义Model和TreeItem是为了使QTreeView能够更好地显示和处理树形数据。通过实现自定义Model和TreeItem,我们可以根据实际需求来构建和操作树形结构。这样,我们就能够更灵活地展示和管理树形数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值