不二如是 发表于 2016-11-25 09:43:08

157 - 模型/视图编程(Model/View) - 【扫盲】

本帖最后由 不二如是 于 2016-11-25 10:47 编辑



应用程序中往往要存储大量的数据,并对他们进行处理,然后通过各种形式先是给用户。

用户需要时还可以对数据进行编辑。

Qt中的模型/视图架构就是用来实现:

大量数据的存储、处理、显示

Qt 4 中就引入了一个新的项视图类!

使用模型/视图架构(就是上面那张图)来管理数据和展示给用户的方式之间的关系。

引入:

'功能分离思想为开发者定制项目提供高度的灵活性'

帮助文档:Model/View Programming




[*]架构介绍

MVC(Model View Controller)是一种起源于Smalltalk的设计模式!

用于创建用户界面!

MVC包含三个组件:

Model -> 模型是应用对象,表示数据

View -> 视图是用户界面,显示数据

Controller -> 控制定义了界面与用户的交互方式。

上面那个稍微翻一下:



模型与数据进行通信,为架构中的其他组件提供了接口。

视图从模型中获得模型索引(Model Index)。

模型索引用来显示数据。

当编辑项目时,代理使用模型索引直接与模型进行通信!

将视图和控制组件结合起来就形成了模型/视图架构。

同样将数据和存储向用户的展示进行了分离,提供了更为简单的框架。

数据和界面进行了分离,这样做使得:

相同的数据在多个不同的视图中显示成为可能

并且这样只需要改变顶层的视图,并不需要改变最底层的数据框架。

为了用户输入能进行灵活处理,还引入了委托(Delegate,代理)。

Delegate的引入后,就可以定制数据的渲染和编辑方式!


[*]组成部分

大体上,MVC可以分为3组:

模型、 视图、 代理

其中每一个组件都使用了抽象基类来定义,三者之间通过信号和槽来实现通信

-> 当数据源数据发生改变时,模型发出信号告知视图。

-> 当用户与显示的项目交互时,视图发出信号提供交互信息。

-> 当编辑时,代理发出信号,告知模型、视图编辑器的状态。


[*]模型



所有的模型都基于QAbstractItemModel类,这个牛x类定义了一个接口,可以提供视图、委托来访问数据。

数据本身并不是一定要存储在模型中,也可以存储在一个数据结构、一个独立的类、文件、数据库、应用程序中的其他组件中。

这个类提供的接口让数据可以灵活的处理各种视图,这些视图可以将数据变现为:

表格(table)、列表(list)、树(tree)等形式。

Qt还提供了一些现成的模型来处理数据项:

-> QStringListModel 用来存储一个简单的QString项目列表

-> QStandardItemModel 管理复杂的树形结构数据项,每一个数据项可以包含任意的数据

-> QFileSystemModel 提供了本地文件系统中文件、目录的信息

-> QSqlQueryModel、QSqlTableModel、QSqlRealtionalTableModel 用来访问数据库


[*]视图



Qt提供了几种不同的类型的视图,他们都完全实现了各自的功能。

-> QListView 将数据项显示为一个列表。

-> QTableView 将模型中数据项先是在一个表格中。

-> QTreeView 将模型的数据项显示在具有层次的列表中。


[*]代理



QAbstractItemDelegate是代理的抽象基类。

从Qt 4.4版本开始,默认的委托实现由QStyledItemDelegate类提供,这也被用作Qt标准视图的默认委托。

QStyledItemDelegate 和 QItemDelegate 是相互独立的哈~

只能选择其一来为视图中的项目绘制和提供编辑器。

他们的主要不同就是:

QStyleItemDelegate使用当前的样式来绘制他的项目。

就是说你要使用样式表(QSS),就用这个作为基类



wei_Y 发表于 2016-11-25 11:12:12

哎呦,更新了。

不二如是 发表于 2016-11-25 11:16:12

wei_Y 发表于 2016-11-25 11:12
哎呦,更新了。

{:10_278:}怨我,太爱小天才养殖场了

傻傻不清楚 发表于 2017-3-4 00:44:07

大爱技术贴
页: [1]
查看完整版本: 157 - 模型/视图编程(Model/View) - 【扫盲】