Qt的Model/view模式

Model-View-Controller(MVC),是从Smalltalk发展而来的一种设计模式,常被用于构建用户界面。
MVC由三种对象组成,Model是应用程序对象,View是它的屏幕显示,Controller定义了用户界面如何如何对用户输入进行响应,在MVC之前,用户界面设计倾向于混合设计,MVC的出现对它们进行了解耦,提高了灵活性与适用性。
Qt将View与Controller结合在一起,形成Model/View模式,该模式相对MVC更简单一些,同时,引入了delegate(委托),使得数据项的渲染与编程可定制。
其中,Model用于访问底层数据,为其他组件访问存储的数据提供接口,视图View通过model->Index来获取底层数据,并将数据绘制到窗体上,委托delegate是在View需要编辑的时候提供一种自定义编辑方式,比如限制只允许输入数字等。
如下图所示:
Qt的Model/view模式_第1张图片
Model与数据通信,并提供接口给结构中别的组件使用。Model、View、Delegate三者之间通过信号槽机制来实现交互:
由Model发出的信号通知View底层数据发生了改变;
由View发出的信号提供了用户与被显示的数据项之间的交互;
由Delegate发出的信号在编辑某个界面元素时被发出,通知Model与View当前元素的状态。

Models

所有的item models都基于QAbstractItemModel类,该类为item模型提供了一个抽象接口,定义了item模型一定能用于与model/view结构的其他组件进行交互操作的标准化接口;该类不支持被实例化,需要将其子类化来创建新模型。
如果需要一个模型用于项目视图,如QML的ListView元素,或C++小部件QListView或QTableView,需要子类化QAbstractListModel或QAbstractTableModel,而不是该类。
另,QStringListModel用于存储简单的QString列表。
QStandardItemModel管理复杂的树形数据结构,每项可包含任意数据项。
QDirModel存储文件目录信息,以及QSqlQueryModel,QSqlTableModel、QSqlRelationTableModel用来访问管理数据库。

底层数据模型作为表层次结构公开给视图和委托,如果不使用层次结构,model是行与列的简单表,每个item都有一个由QModelIndex指定的唯一索引。
Qt的Model/view模式_第2张图片
子类
当标准的model无法满足需求时,可以子类化QAbstractItemModel、QAbstractListModel、QAbstractTableModel来定制。
在子类化QAbstractItemModel时,至少必须实现index()、parent()、rowCount()、ColumnCount()和data(),这些函数用于所有只读模型,并构成可编辑模型的基础。

View

QAbstractItemView为items view类提供基础功能。
其子类有:
| QColumnView | 列视图的Model/View实现 |
| QHeaderView | 提供了一个标题行或列的item view |
| QListView | 列表view |
| QTableView | 表格View |
| QTreeView | 树形VIew |
如果不满足需求,可以自定义子类化,也可以对它的子类再子类化定制。

delegate

QAbstractItemDelegate是Model/View架构中的用于delegate的抽象基类,用于显示和编辑来自model的item。
子类有:QItemDelegate和QStyledItemDelegate。

你可能感兴趣的:(Qt)