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查询结果的数据模型类


发布评论