简 述: 在Qt中,有一种将数据和和视图进行串通起来,就像网页和数据库的关系一样;而这就是“Model-View-Delegate”(模型-视图-代理)的结构。
[TOC]
本文初发于 “偕臧的小站“,同步转载于此。
Model/View(模型/视图):
在GUI界面交互的时候,用户在(软件/网页的)界面进行查看数据的时候,看到这个这个就被称之为视图;而视图展示出来的数据,是从模型里面取出来的,你可以将它看做看做一个专门存放数据的容器(黑匣子);
数据(Data):
实际的数据,比如是数据表里面的一个项,也或许是一个QStringList,也许只是一个数字或者字母或者字符串:abc:
视图(或视图组件 View):
客户端的界面,用来查看数据的控件,比如表格Table或者树形图目录结构Tree;视图从数据模型获取得到每一个数据项的模型索引(modelindex),然后通过模型索引获取数据; Qt提供一些现成的数据模型视图组件:
主要的数据模型: QListView / QTreeView / QTableView
其对应的简便利类: QListWidget / QTreeWidget / QTableWidget
模型(数据模型 Model):
与实际数据数据进行同行,并且为视图组件提供数据结构
代理(Delegate):
代理是可以让用户,自己更加细致定义绘画自己所需要的窗口的;比如说,可以在一个Table的控件里面,将一个item的项替换成一个QCheckBox或者一个下拉列表表框的控件之类的(eg:让你填表时候,选择年龄等)
由于数据和模型实际相互分离开,所以是可以一个数据模型对应⇒多个数据模型的
数据模型:
所有基于项数据(item Data)的数据模型(Model)都是基于QAbstractItemModel
这个抽象类的。
其几个主要的类的层次结构如下:
其中:
QStringList Model:
用于处理字符串列表数据的数据模型类QStandardltem Model:
标准的基于项数据的数据模型类,每个数据项数据都可以是任意数据类型QFileSystem Model:
计算机上文件系统的数据模型类QSortFilterProxy Model:
用于其他数据模型的结合,提供排序和过滤功能的数据模型类QSqlQuery Model:
用于数据库SQL查询结果的数据模型类QSqlTable Model:
用于数据库的一个数据表的数据模型类QSqlRelationalTable Model:
用于关系型数据表的数据模型类
视图模型:
其中它们的关系如下,在使用的时候,往往只是需要调用setModel(),就可以实现一个数据模型和视图组件和数据模型之间的关联;对视图组件的数据修改,将会直到自动保存到关联的数据模型里面,且一个数据模型是可以在多个视图组件里面显示数据的。
其中的详细说明如下:
QListView:
用于显示单列的列表数据模型,适用于一维数据的操作QTreeView:
用于显示树状结构,使用与树状结构数据的操作QTableView:
用于显示表格状数据,适用于二维型数据的操作QColumnView:
用于多个QListView显示树状层次结构,树状结构的一层用一个QLIstView显示QHeaderView:
提供行表头或者列表头的视图组件
模型索引:
模型索引(Model Index):是来保证数据和其存取方式的隔离。
QModeIndex
是(临时的)一个索引类。模型索引提供数据存取的一个临时指针,用于通过数据模型的提取或者修改,因为模型内部组织结构的数据很容易变化,所以这个模型索引是临时的;
QPersistentModeIndex
是持久性的模型索引。