Qt-模型视图框架

一 简介

1. 模型视图架构(Model/View Architecture)是 Qt 中用于处理和展示数据的一种设计模式,它将数据的管理(模型 Model)、数据的可视化(视图 View)、用户与数据的交互(控制器,通常是通过委托(代理) Delegate 实现)分离开来,从而提高了代码的可重用性和可维护性。

二 分类

1. 模型

1.1 说明:模型是数据的容器,用于管理原始数据,模型提供了一种标准的接口,使得数据可以被不同的视图访问和展示,而无需关心数据的具体来源或格式。

1.2 抽象模型类

1. QAbstractItemModel
说明: 这是所有模型类的基类,派生于 QObject,定义了接口来管理数据结构和与视图的交互。它不直接用于实例化,而是作为其他具体模型类的父类。常作为自定义树状模型的基类使用。

2. QAbstractListModel
说明:派生于 QAbstractItemModel,用于实现一维列表模型;可以作为自定义列表模型的基类使用。

3. QAbstractTableModel
说明:派生于 QAbstractItemModel,用于实现表格模型;可以作为自定义表格模型的基类使用。

1.3  标准模型类

1. QStandardItemModel
说明: 一个用于管理标准项(QStandardItem)的模型,适合于处理表格或列表形式的数据。每个项都可以有文本、图标、数据等属性,且支持层级结构,便于构建树形视图。

2. QStringListModel
说明: 简单的模型,用于存储字符串列表。常用于下拉列表、组合框等简单数据展示。

3. QFileSystemModel
说明: 用于展示文件系统目录结构和文件的模型,支持文件图标、类型等信息。

4. QSqlQueryModel
说明: 用于展示 SQL 查询结果的模型,每一行代表数据库查询结果的一条记录,只能展示不能编辑。

5. QSqlTableModel
说明: 提供了对单一数据库表的直接操作能力,包括读取、修改和提交数据到指定的表中,比 QSqlQueryModel 更强大,支持编辑功能。

6. QSqlRelationalTableModel
说明:是对 QSqlTableModel 的扩展,除了提供对单一数据库表的读取、修改、编辑、提交数据功能外,还增加了对表关系的支持,包括:主键、外键、字段、索引等。

注意:QSqlRelationalTableModel 并不能直接从数据库中读取表关系,需要我们给它显示的设置表关系,它根据我们设置的表关系进行操作。

2. 视图 

2.1 说明:视图提供一组界面组件来展示模型管理的数据,不同的视图可以以不同的方式展示同一个模型管理的数据。

2.2 抽象视图类

1. QAbstractItemView
说明: 所有项视图类的基类,派生于 QWidget,定义了与模型交互和渲染项的基本接口。

2.3 标准视图类

1. QListView
说明: 用于显示模型中的数据为一个简单的列表或图标集合,不包含子项的层次结构。适用于展示简单的、线性排列的数据集。

2. QTableView
说明: 用于展示表格数据,即带有行列结构的数据。每个模型索引对应一个单元格,适合展示结构化的数据集,如电子表格。

3. QTreeView
说明: 用于展示具有层次结构的数据,如文件系统或目录结构。可以显示多级的嵌套数据,每个节点可以展开和折叠。

4. QColumnView
说明: 是一种多列视图,用户可以通过拖动列来浏览数据。每个列代表模型的一个维度(相当于一个 QListView)。

5. QHeaderView
说明: 是一个特殊的视图,用于显示和定制 QTableView, QListView, QTreeView 等视图的列标题和行标题。

3. 委托(代理)

3.1 说明: 委托(代理)负责用户与数据的交互,例如编辑、绘制等。Qt 内置的委托类功能有限,而且可以被其他功能(例如:修改样式表)代替;在面对复杂的绘制、交互需求时,我们需要创建自定义委托类、重写虚函数来实现需求。

3.2 抽象委托(代理)类

1. QAbstractItemDelegate
说明: 所有自定义委托的基类,提供了绘制项、编辑创建和编辑器管理的基础接口。

3.3 标准委托(代理)类

1. QItemDelegate
说明: QAbstractItemDelegate 的默认实现,提供了基本的数据显示和编辑功能,适用于大多数标准数据类型。

2. QStyledItemDelegate
说明: 继承自 QItemDelegate,支持样式表(style sheets),更适合现代 Qt 界面,是 Qt 标准视图(如 QListView、QTableView、QTreeView)的默认委托。

4. 代理模型 

4.1 说明:代理模型常用于在数据被传递给视图之前对模型中的数据进行排序、搜索、过滤、转换等操作,而不改变模型中的数据。

4.2 抽象代理模型类

1. QAbstractProxyModel
    说明:是所有代理模型的基类,用于在数据模型和视图之间提供一个中间层,实现数据的转换、过滤或其他处理,而无需修改原始模型。

4.3 标准代理模型类

1. QSortFilterProxyModel
    最常用的代理模型,它提供了数据排序和过滤的功能。可以利用它来根据任意条件对数据进行排序,或是过滤掉不符合条件的行。

2. QIdentityProxyModel
    说明:这个代理模型主要用于数据的轻微修改或重组,它不进行排序或过滤,但可以重写 data()函数来转换数据,例如,改变数据的显示格式,而不影响模型的实际数据。

5. 其他 

5.1 模型索引(QModelIndex):在模型视图架构中用于唯一标识模型中的数据,视图根据模型索引从模型中检索数据。

5.2 标准项(QStandardItem):在模型视图架构中用于表示标准项,通常与 QStandardItemModel 配合使用,以构建和管理数据模型。

5.3 选中项(QItemSelectionModel):用于管理和跟踪视图中项的选中情况;独立于具体的视图,因此可以被多个视图共享,从而实现选择状态的同步。

5.4 数据角色(Qt::ItemDataRole):)是一个枚举类,用于区分模型中存储的不同类型数据的标识。这些角色允许模型以灵活的方式存储数据,以便视图可以根据需要请求特定类型的信息。

5.5 项的标志(Qt::ItemFlags):是一个枚举类型,用于定义在 Qt 模型视图框架中项(Item)的行为和交互特性,例如:是否可选、可编辑、可拖动等。

        本章给大家总体介绍了模型视图框架的基本组成;在之后的章节中我会详细介绍模型、视图、委托(代理)、代理模型的使用,以及如何使用自定义模型、自定义视图、自定义委托(代理)、自定义代理模型。在这块内容的最后我会跟大家分享一个使用模型视图框架创建自定义表格控件的Demo。请大家多多点赞关注~


 

  • 37
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值