26、模型视图三要素---------Model/View模型视图
模型视图三要素
Qt 的 Model-View-Delegate 模式是一种设计模式,旨在分离数据(模型)、展示(视图)和用户交互(委托)。这种模式使得开发者可以灵活地处理数据的显示和编辑,同时保持代码的整洁性和可维护性。
主要概念
1、Model:负责存储和管理数据。可以是自定义模型或 Qt 提供的标准模型(如 QStringListModel、QStandardItemModel 等)。
2、View:负责显示数据,使用模型提供的数据来渲染用户界面。常见的视图有 QListView、QTableView 和 QTreeView。
3、Delegate:负责处理视图中每个项的显示和编辑。委托可以自定义每个项的外观和行为。
在部分企业的数据和展示管理中采用的是模型视图的方式,Model-View-Delegate这种方式可以实现一个模型对应多个展示界面的效果。
三者关系如下

- 模型 分为很多种,都是基于QAbstractItemModel基类派生而来。这个类定义了视图组件和代理存取数据的接口。模型只是在内存中临时存储数据,模型的数据来源可以是其他类、文件、数据库或任何数据源
-
- QFileSystemModel 用于表示计算机上文件系统的模型类
- QStringListModel 用于表示字符串列表数据的模型类
- QStandardItemModel 标准的基于项的模型类,每个项是一个 QStandardItem 对象
- QSqlQueryModel 用于表示数据库 SQL 查询结果的模型类
- QSqlTableModel 用于表示数据库的一个数据表的模型类
- 视图 就是用于显示模型中的数据的界面组件
-
- QListView 列表方式视图展示
- QTreeView 树的方式视图展示
- QTableView 表格方式视图展示
- 代理 QAbstractItemDelegate 是所有代理类的基类, 不能直接使用,可使用的是如下两个
模型类的继承关系
-
- QItemDelegate
- QStyledItemDelegate

模型结构
模型可以组织成很多种结构,如下三种最为常用
- 表格模型
- 列表模型
- 树状模型

项和索引
模型内部存储的是item,我们叫做项,从模型中获取项,可以采用索引的方式
要获得一个模型索引,必须提供 3 个参数:行号、列号、父项的模型索引
QAbstractItemModel提供了index方法,所以继承自它的模型都具有这个方法
[pure virtual] QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex &parent = QModelIndex()) const
row表示获取哪一行的元素,columne表示获取哪一列的元素, parant表示获取哪个节点下的子节点。
对于表格中的A,B,C三项可通过如下代码获取
QModelIndex indexA = model->index(0, 0, QModelIndex());
QModelIndex indexB = model->index(1, 1, QModelIndex());
QModelIndex indexC = model->index(2, 1, QModelIndex());
因为表格模型中,A,B,C的根项为最顶层节点,所以第三个参数用 QModelIndex()表示。
当模型为列表或表格结构时,使用行号、列号访问数据比较直观,所有项的父项就是顶层项,对于树状模型就比较复杂,获取B的索引为
QModelIndex indexA = model->index(0, 0, QModelIndex());
QModelIndex indexC = model->index(2, 1, QModelIndex());
QModelIndex indexB = model->index(1, 0, indexA);
设置项的数据
我们为一个项设置数据采用如下接口
bool QAbstractItemModel::setData(const QModelIndex &index, const QVariant &value,
int role = Qt::EditRole)
其中,index 是项的模型索引,value 是需要设置的数据,role 是设置数据的角色
第三个参数role可以是一系列角色的并集, 角色可参考下表

获取项的数据
我们可以通过data方法获取index对应的项的数据
[pure virtual] QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)