Qt开发总结(14)——Model/View 框架

上篇总结中也提到了,Qt还有一类常见的UI控件,这类控件采用了Qt的一种称作Model/View框架的技术。每个UI开发人员都应该了解ModelView编程,该技术涉及一系列list、table和树tree结构等控件。这些视图类使用model/view体系结构来管理数据与其显示方式之间的关系。此体系结构引入的功能分离为开发人员提供了更大的灵活性,可以自定义项目的表示形式,并提供标准的模型界面,以允许将各种数据源与现有项目视图一起使用。

Model/View 框架

Model-View-Controller(MVC)机制是一种经常使用的管理用户数据和视图关系的模式,通常在构建用户界面时使用。model是管理数据对象,view是将数据显示给用户,Controller提供数据处理接口。在MVC使用之前,用户数据处理接口与数据对象设计在一起,MVC简化了这种操作,从而增加来很多灵活性。

如果将View和Controller连接在一起,那么就是model/view机制。这仍然使用和数据和视图分离的原则,但是它提供了一个更加简单的框架。这种分离使将相同数据显示在多个视图中成为了可能,并且重新实现新的数据,但是不需要改变数据的结构。为了用户输入灵活,我们现在介绍delegate(代理)的概念。使用delegate的优点是deledate使得数据的items可以被编辑和定制。

Qt开发总结(14)——Model/View 框架_第1张图片

如图所示,model/view机制中,model负责与数据源交流,为机制中其他元素提供接口。view从model中获取索引(index), 约束数据源中的数据item。在标准的views中,delegate负责修饰数据的item,当一个item被编辑后,delegate直接使用model index与model进行交流。

 

概括来说,model/view classes 可以被分成三个部分:model, view,和delegate。每一部分都是在abstract classes中定义。(abstract classes用来提供公共接口和一些默认的操作)。abstract classes可以被用来继承,通过继承为每个model,view或者delegate提供更加丰富的功能。

model,view,和delegate之间使用信号和槽之间进行交流。

1.来自于model的信号通知view数据已经改变

2.来自于view的信号提供用户与items交互的信息

3.来自于delegate的信号被用户编辑期间,通知model和view的编辑状态

Models(模型)

所有的models类都继承自QAbstractItemModel类。这个类定义了views和delegates获取数据的接口。数据本身并不会被存储在model中,它可能存储在一个特定的数据结构中,或者是一个文件,数据库或者其他的应用元素中。

QAbstractItemModel为数据与视图(tables,lists,trees)交互提供一些足够灵活的接口。但是当用于list和table结构时,QAbstractListMode和QAbstractTableModel 类会更加方便。因为他们为公共函数提供适当的默认操作。这些类以可以被继承,用于为特定需求的lists和tables提供models。

Qt提供了一些已经定义好的models:

QStringListModel被用于存储一个简单的QString items 列表

QStandardItemModel管理较为复杂的树结构items,每一个item可能包含任意的数据

QFileSystemModel提供一些关于本地文件系统中的文件和目录的信息

QSqlQueryModel,QTableModel,和QSqlRelationTableModel被用于使用model/view获取数据库中的数据

如果这些标准的models不能满足你的需要,你可以继承QAbstractItemModel,QAbstractListModel或者QAbstractTableModel来构造自己的models。

QStringListModel

Stores a list of strings

QStandardItemModel

Stores arbitrary hierarchical items

QFileSystemModel

Encapsulate the local file system

QDirModel

QSqlQueryModel

Encapsulate an SQL result set

QSqlTableModel

Encapsulates an SQL table

QSqlRelationalTableModel

Encapsulates an SQL table with foreign keys

 

Views(视图)                                        

通过三个不同的views来实现:QListView显示items列表,QTableView在表格中显示model中的数据,QTreeView在树形list中显示数据。这些类都继承自QAbstractItemView。尽管这些类是已经实现被用于特定用途,但是他们也可以被继承来定制views。我将在后面具体介绍这些控件类的使用方法。

Delegate(代理)

QAbstractItemDelegate是model/view机制中一个抽象基类delegates。默认的delegate实现通过QStyleItemDelegate类实现,这被用作Qt标准views的默认delegate。我们推荐使用QStyleItemDelegate作为实现定制delegate时的基本的类。

Widget(控件)

从标准视图类派生出许多便利类,以使依赖Qt的以item为基础的item view和table类的应用程序受益。这些类主要有QListWidget,QTreeWidget和QTableWidget。这些类的灵活性不如视图类,并且不能与任意模型一起使用。而且他们不能再被继承。我们建议您使用模型/视图方法来处理项目视图中的数据,如果你确实希望在仍然使用基于项目的界面的同时利用模型/视图方法提供的功能,请考虑将视图类(例如QListView,QTableView和QTreeView)与QStandardItemModel 一起使用。下面是一些常见的控件:

控件示意

类名

模型/视图框架

Qt开发总结(14)——Model/View 框架_第2张图片

QListWidget

QListView

Qt开发总结(14)——Model/View 框架_第3张图片

QTableWidget

QTableView

Qt开发总结(14)——Model/View 框架_第4张图片

QTreeWidget

QTreeView

Qt开发总结(14)——Model/View 框架_第5张图片

 

QColumnView shows a tree as a hierarchy of lists

QComboBox can work as both a view class and also as a traditional widget

 

小结

所以,Mode/View提供了一个使用更通用的体系结构的解决方案。Mode/View消除了标准控件可能出现的数据一致性问题。Mode/View还可以更容易地使用同一数据的多个视图,因为一个模型可以传递给多个视图。最重要的区别是Mode/View控件不在表单元格后面存储数据。实际上,它们直接从您的数据操作。因为视图类不知道数据的结构,所以需要提供一个包装器,使数据符合QabstracteModel接口。视图使用此接口读取和写入数据。实现QabstratemModel的类的任何实例都称为模型。一旦视图接收到指向模型的指针,它将读取和显示其内容,并成为其编辑器。

你可能感兴趣的:(Qt)