设为首页 加入收藏

TOP

13.2 模型(Models)
2013-10-07 15:18:40 来源: 作者: 【 】 浏览:62
Tags:13.2 模型 Models

13.2  模型(Models)

依据数据项之间的关系,模型具有如图13 6所示的三种拓扑结构:(1)列表模型(List Model)。各数据项相互独立,组成一个线形的序列。比如,一个班级所有学生的姓名就组成一个列表,每个数据项就是一名学生的姓名。(2)表格模型(Table Model)。数据项可被划分为若干行、若干列。比如,一个班级所有学生的成绩信息可被表示为一个表格,其中第一列表示学生姓名,第二列表示学生学号,第三列表示英语课程的成绩,第四列表示数学课程的成绩。每一行表示一个学生的成绩信息。(3)树模型(Tree Model)。这种模型具有树状层次结构,每个数据项可以包含若干行、若干列的子数据项,而其中每个子数据项又可以包含更深层的子数据项。

 
(点击查看大图)图13 6  模型的三种拓扑结构
一个树模型的例子如图13 7所示。该例子显示的是C++(www.cppentry.com)创始人Bjarne Stroustrup所著书籍The Design and Evolution of C++(www.cppentry.com)的部分目录。不可见根具有4行、3列子节点,每行表示书中某一章的目录信息,其中第1列是该章的编号,第2列是该章的题目,第3列是该章的起始页码。每行的第一个数据项又含有若干行、若干列子数据项。比如,图中的"Chapter 1"含有"Section 1.1","Section 1.2","Section 1.3"所在行的9个子数据项。
 
图13 7  具有树状结构的模型

为了将以上三种结构统一起来,Model/View框架引入了"不可见根"的概念。对于列表模型,所有行的数据项都是这个不可见根的子节点。对于表格模型,所有行、所有列的数据项都是这个不可见根的子节点。对于树模型,位于最顶层的那些数据项(可能包含若干行、若行列)是这个不可见根的子节点。引入这个概念后,列表模型、表格模型都可以被看作树模型--仅含有最顶层节点,不含任何子节点的树模型。

Qt在设计模型类的基类QAbstractItemModel时,只处理树状结构的模型,并没有单独考虑列表、表格模型。视图类的基类QAbstractItemView在访问一个模型中的数据项时,也认为模型具有树状结构。Model/View框架中的其他类,比如只能存放具有列表结构数据项的模型类QAbstractListModel以及只能以列表方式显示数据项的视图类QListView,都是把列表或者表格看作树的一种特殊形式,它们并没有将列表或者表格当作独立的对象来处理。

使用Model/View框架时,我们首先需要将所要显示的数据存放在数据项中。除了这些数据外,Qt令数据项存放更多的数据,比如其中一些数据表示显示数据项时所用的字体、颜色、背景颜色等,视图对象在显示一个数据项时,会读取这些数据。一个数据项所包含的这些数据被称为"数据子项",它们所起的作用被称为"角色"。13.2.1节将阐述各个角色对应数据子项的作用。

对于列表或者表格结构的模型,视图对象可以简单地使用行号、列号来访问模型中的某个数据项。但是对于树状结构的模型,仅使用行号、列号无法精确地定位一个数据项。Model/View框架使用"索引"来定位一个数据项,13.2.2节阐述如何为一个数据项创建索引。

理解了"角色"以及"索引"这两个基本的概念之后,我们就可以尝试使用Model/View框架了。总体上,我们可以使用以下三种方式来使用该框架。

1.直接使用便利视图类,比如13.7节讨论的QlistWidget,QTableWidget或者QTreeWidget。这些视图类在其内部定义了模型对象,程序员只需简单地调用几个函数,就可以建立起数据项之间的拓扑关系,并将所要显示的数据写入到数据项中。

2.使用便利模型类来存放应用程序的数据,再使用一个视图对象显示这些数据。13.2.5节讨论了部分便利模型类,比如QStringListModel、QFileSystemModel。最简单的情形下,程序员只需调用一两个函数,就可以创建一个完整的模型。

3.从已有的模型类派生新模型类,将应用程序所要显示的数据定义在这个派生类中。实现基类QAbstractItemModel中定义的接口,将模型中的数据项呈现给其他视图对象。

虽然前两种方式简单、易于使用,但是无助于我们理解模型类和Model/View框架中其他类的协作关系。因此,我们将在13.2.3节首先阐述上述第3种使用方式。这一节是理解Model/View框架工作原理的钥匙。在读者深刻理解了模型类和其他类的协作关系之后,13.2.4以及13.2.5节阐述上述第2种使用方式。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇13.2.1 角色与数据子项 下一篇13.2.2 索引

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: