模型视图三要素

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
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐