2024年3月13日发(作者:)

Model/View(模型/视图)结构是 Qt 中用界面组件显示与编辑数据的一

种结构,视图(View)是显示和编辑数据的界面组件,模型(Model)是视图与

原始数据之间的接口。

GUI 应用程序的一个很重要的功能是由用户在界面上编辑和修改数据,典

型的如数据库应用程序。数据库应用程序中,用户在界面上执行各种操作,实

际上是修改了界面组件所关联的数据库内的数据。

将界面组件与所编辑的数据分离开来,又通过数据源的方式连接起来,是

处理界面与数据的一种较好的方式。Qt 使用 Model/View 结构来处理这种关系,

Model/View 的基本结构如图 1 所示。

图 1 Model/View基本结构

其中各部分的功能如下:

数据(Data)是实际的数据,如数据库的一个数据表或SQL查询结果,内存中

的一个 StringList,或磁盘文件结构等。

视图或视图组件(View)是屏幕上的界面组件,视图从数据模型获得每个数据

项的模型索引(model index),通过模型索引获取数据,然后为界面组件提供

显示数据。Qt 提供一些现成的数据视图组件,如 QListView、QTreeView 和

QTableView 等。

模型或数据模型(Model)与实际数据通信,并为视图组件提供数据接口。它从

原始数据提取需要的内容,用于视图组件进行显示和编辑。Qt 中有一些预定义

的数据模型,如 QStringListModel 可作为 StringList 的数据模型,

QSqlTableModel 可以作为数据库中一个数据表的数据模型。

由于数据源与显示界面通过 Model/View 结构分离开来,因此可以将一个

数据模型在不同的视图中显示,也可以在不修改数据模型的情况下,设计特殊

的视图组件。

在 Model/View 结构中,还提供了代理(Delegate)功能,代理功能可以

让用户定制数据的界面显示和编辑方式。在标准的视图组件中,代理功能显示

一个数据,当数据被编辑时,代理通过模型索引与数据模型通信,并为编辑数

据提供一个编辑器,一般是一个 QLineEdit 组件。

模型、视图和代理之间使用信号和槽通信。当源数据发生变化时,数据模

型发射信号通知视图组件;当用户在界面上操作数据时,视图组件发射信号表

示这些操作信息;当编辑数据时,代理发射信号告知数据模型和视图组件编辑

器的状态。

数据模型

所有的基于项数据的数据模型(Model)都是基于 QAbstractltemModel 类

的,这个类定义了视图组件和代理存取数据的接口。数据无需存储在数据模型

里,数据可以是其他类、文件、数据库或任何数据源。

Qt 中与数据模型相关的几个主要的类的层次结构如图 2 所示:

图 2 Qt中模型类的层次结构

图 2 中的抽象类是不能直接使用的,需要由子类继承来实现一些纯虚函数。

Qt 提供了一些模型类用于项数据处理,常见的几个见表 3。

表 3 Qt 提供的数据模型类

Model 类

QStringListModel

QStandardltemModel

QFileSy stemModel

QSortFilterProxyModel

QSqlQueryModel

用途

用于处理字符串列表数据的数据模型类

标准的基于项数据的数据模型类,每个项数据可

以是任何数据类型

计算机上文件系统的数据模型类

与其他数据模型结合,提供排序和过滤功能的数

据模型类

用于数据库SQL查询结果的数据模型类