Qt Model/View 学习(2) 您所在的位置:网站首页 中国女排简笔画法 Qt Model/View 学习(2)

Qt Model/View 学习(2)

2024-05-29 03:14| 来源: 网络整理| 查看: 265

目录 0. 前言1. Model有关类2. Model索引:QModelIndex3. 小结

0. 前言

上一篇文章讲了Qt中Model/View框架的起源(和给人的优越感 ),以及它大概是怎么个思路,最后花了不少篇幅讲了为什么要使用Model/View,现在想想多是在给自己打气,好坚持学下去👻。

本文开始介绍有关函数接口了,既然数据Data是用户自定义的,那就从Model开始介绍。

系列文章回顾: Qt Model/View 学习(1) - 是什么和为什么?

1. Model有关类

先上一张Qt有关Model类的UML类图,空心箭头表示泛化关系,也就是派生类指向基类。如果想了解更多一点关于UML类图的知识,可以移步这篇文章。 在这里插入图片描述 图中C位自然是QAbstractItemModel了,它继承自QObject获得了信号和槽机制,派生出了诸多Model类,但其中核心就2个:

QAbstractListModel:提供一维矩阵模型的抽象基类;既然是抽象类,那我们只能派生自己的类才能使用;QAbstractTableModel:提供表格模型的抽象基类;

其它的有:

QFileSystemModel:提供本地文件系统的数据模型,使用场景十分受限,也可以先不用过多理会;QAbstractProxyModel:提供排序、过滤、或其它数据处理任务的代理模型,暂时可以不用过多理会;QStandardItemModel:提供了一种使用控件的Model类,换言之,它Model了,但没有完全Model,在学习Model/View的路上可以不用过多理会;QDirModel:官方建议使用性能更好的QFileSystemModel,那可以不用过多理会;

所以,虽然继承树似乎内容庞大,但我们只要搞懂QAbstractListModel和QAbstractTableModel这俩,就能掌握Model的精髓了,好耶!

而这俩,从名字看就很简单:一个一维数组一个二维数组,而且打开这两个类的文档,篇幅极少,滚动条那么大一个,就这?

在这里插入图片描述

2. Model索引:QModelIndex

先别着急膨胀,QAbstractListModel和QAbstractTableModel的文档内容少是因为大部分内容都在QAbstractItemModel中实现了,而打开QAbstractItemModel类的文档就又有些劝退了……

不过换言之,只要掌握了QAbstractItemModel,就能掌握Model的精髓了。

后续将用 “Model类” 来指代从 QAbstractItemModel派生的类;

在上一篇文章中讲过,Model是对数据的解析模型,比如20个散装变量,可以被解析成一个4*5的矩阵。而如何去索引矩阵中的数据就是重点了,这需要介绍本小节的主角QModelIndex了,先上一张图: 在这里插入图片描述 以下是核心解释,看完这里基本就掌握索引了:

QModelIndex是Model类的索引,基本特征是二维索引,通过row()和column()方法获取其位置;

但它不是纯二维索引,还提供了parent()和child()方法获取上层节点和下层节点。还提供了sibling()方法,提供row和column的偏移量来获取同一层的兄弟节点;

一般使用Model类的createIndex()方法创建索引,需要提供row,column和parent;

使用构造函数创建的QModelIndex对象是无效的,无效索引通常被用于指代最顶层对象的parent节点,可通过isValid()方法来判断是否有效,有效表示该对象是某个Model对象的有效索引;

要获取一个Model类的索引时,使用index()方法获取,但很遗憾该接口一般不是公开的;

如果设为公开,或许会比较破坏封装性;

QModelIndex对象最好是随用随取,不要指望某个QModelIndex在调用了其它Model函数之后还能起作用,这里暗示QModelIndex是“对位不对人”的,如果希望“对人不对位”,可以使用QPersistentModelIndex类;

但尽管使用QPersistentModelIndex类也最好先用isValid()断一下,因为有可能索引的对象人没了。

最后再补一嘴,为什么Model类的索引被设计成这样?

简单来说,为了适应常见的数据结构:树结构 和 矩阵结构。QModelIndex的行和列索引使其能够支持矩阵结构,parent()和child()接口使其能够支持树结构。

下图是官方用来说明三种常用模型(列表、表格、树)的图。放到这里来参考的原因是QModelIndex的表示能力是大于以下三种模型的,因为每个QModelIndex对象都可以作为parent,对于每个parent,都可以索引其二维孩子child。 在这里插入图片描述 搞清楚如何索引之后,Model类基本就 攻略了30% 了,是不是很简单呢?

3. 小结 Model类主要搞懂QAbstractItemModel即可,搞明白之后由该类派生的QAbstractListModel和QAbstractTableModel也会很容易理解;Model类主要是完成原始数据到模型的映射,所以如何索引模型数据是关键,Qt中采用QModelIndex类来索引模型数据;QModelIndex类提供了行、列、父、子、兄弟的接口,以此实现对常见的矩阵结构和树结构原始数据的支持。

如有错误欢迎指正,共同进步~

今天你学废了吗?



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有