MVC视图和控制器对象相结合,其结果是模型/视图结构,仍然分离了数据与呈现给用户的方式,使得它可以在几个不同的视图中显示相同的数据,并实现新类型的视图而无需改变底层的数据结构。为了灵活的处理数据输入,则引入委托的概念。在此框架中引入委托的有点事:允许项目数据显示和自定义编辑。
模型与数据源进行通信,在这个体系结构中为其它组件提供了一个接口。通信的性质依赖于数据源的类型以及模型的实现方式。
视图从模型中得到模型索引,这些都是引用到数据项。通过为模型提供模型索引,视图可以从数据远中检索数据项。
在标准的视图里,委托呈现数据项目。当一个项目被编辑,委托和模型直接利用模型索引进行通信。
模型、视图、委托使用信号和槽相互通信
模型
所有模型都是基于QAbstractItemModel类。这个类定义了一个使用视图和委托来访问数据的接口,QAbstractListModel和QAbstractTableModel
Qt提供了一些现成的模型,可以用来处理数据项:
QStringListModel,QStandardItemModel,QFileSystemModel,
视图
基于QAbstractItemView抽象基类,QListView,QTableView,QTreeView
委托
QAbstractItemDelegate在模型/视图框架中代表抽象的基类。默认的委托有QStyledItemDelegate提供,这被Qt的标准视图用作默认的委托。然而,QStyledItemDelegate和QItemDelegate独立代替绘画,且为视图提供编辑器。它们之间的区别在于QStyledItemDelegate使用当前样式来绘制项目。
Model indexes
视图和委托通过模型索引来请求显示的数据项,模型只需要知道如何获取数据,并通过模型管理的数据的类型可以被相当普遍的定义。
临时模型索引由QModelIndex类提供,持久性模型索引由QPersistentModeIndex类提供,取得对应于数据项的模型索引,模型中必须制定三个属性:一个行号,一个列号,以及父项的模型索引
项目角色
模型中的项目可以为其它组件演绎不同的角色,允许为不同的情况提供不同类型的数据。通常情况下,包含数据的项目用于若干不同的角色,且标准角色被QT::ItemDataRole定义
我们可以通过模型索引传递给项目的项目向模型请求项目数据,并通过指定一个角色来获取想要的数据类型
数据类型被称为模型的角色指示器。视图可以以不同的方式显示角色,因此,为每个角色提供相应的信息非常重要。
委托
控制委托的标准接口在QAbstractItemDelegate类中定义,Qt提供的标准视图中使用QItemDelegate。委托接口的默认实现以一贯风格来呈现项目为每个标准视图:QListView、QTableView、QTreeView。
所有标准角色由所使用的标准视图中的默认委托处理。