有时,咱们的系统须要显示大量数据,好比从数据库中读取数据,以本身的方式显示在本身的应用程序的界面中。早期的 Qt 要实现这个功能,须要定义一个组件,在这个组件中保存一个数据对象,好比一个列表。咱们对这个列表进行查找、插入等的操做,或者把修改的地方写回,而后刷新组件进行显示。这个思路很简单,也很清晰,可是对于大型程序,这种设计就显得苍白无力。好比,在一个大型系统中,你的数据可能很大,所有存入一个组件的数据对象中,效率会很低,而且这样的设计也很难在不一样组件之间共享数据。若是你要几个组件共享一个数据对象,要么你就要用存取函数公开这个数据对象,要么你就必须把这个数据对象放进不一样的组件分别进行维护。数据库
Smalltalk 语言发明了一种崭新的实现,用来解决这个问题,这就是著名的 MVC 模型。对这个模型无需多言。MVC 是 Model-View-Controller 的简写,即模型-视图-控制器。在 MVC 中,模型负责获取须要显示的数据,而且存储这些数据的修改。每种数据类型都有它本身对应的模型,可是这些模型提供一个相同的 API,用于隐藏内部实现。视图用于将模型数据显示给用户。对于数量很大的数据,或许只显示一小部分,这样就能很好的提升性能。控制器是模型和视图之间的媒介,将用户的动做解析成对数据的操做,好比查找数据或者修改数据,而后转发给模型执行,最后再将模型中须要被显示的数据直接转发给视图进行显示。MVC 的核心思想是分层,不一样的层应用不一样的功能。数据结构
Qt 4 开始,引入了相似的 model/view 架构来处理数据和面向最终用户的显示之间的关系。当 MVC 的 V 和 C 结合在一块儿,咱们就获得了 model/view 架构。这种架构依然将数据和界面分离,可是框架更为简单。一样,这种架构也容许使用不一样界面显示同一数据,也可以在不改变数据的状况下添加新的显示界面。为了处理用户输入,咱们还引入了委托(delegate)。引入委托的好处是,咱们可以自定义数据项的渲染和编辑。架构
如上图所示,模型与数据源进行交互,为框架中其它组件提供接口。这种交互的本质在于数据源的类型以及模型的实现方式。视图从模型获取模型索引,这种索引就是数据项的引用。经过将这个模型索引反向传给模型,视图又能够从数据源获取数据。在标准视图中,委托渲染数据项;在须要编辑数据时,委托使用直接模型索引直接与模型进行交互。框架
总的来讲,model/view 架构将传统的 MV 模型分为三部分:模型、视图和委托。每个组件都由一个抽象类定义,这个抽象类提供了基本的公共接口以及一些默认实现。模型、视图和委托则使用信号槽进行交互:编辑器
全部的模型都是QAbstractItemModel
的子类。这个类定义了供视图和委托访问数据的接口。模型并不存储数据自己。这意味着,你能够将数据存储在一个数据结构中、另外的类中、文件中、数据库中,或者其余你所能想到的东西中。咱们将在后面再详细讨论这些内容。函数
QAbstractItemModel
提供的接口足够灵活,足以应付以表格、列表和树的形式显示的数据。可是,若是你须要为列表或者表格设计另外的模型,直接继承QAbstractListModel
和QAbstractTableModel
类可能更好一些,由于这两个类已经实现了不少通用函数。关于这部份内容,咱们也会在后文中详述。性能
Qt 内置了许多标准模型:设计
QStringListModel
:存储简单的字符串列表。QStandardItemModel
:能够用于树结构的存储,提供了层次数据。QFileSystemModel
:本地系统的文件和目录信息。QSqlQueryModel
、QSqlTableModel
和QSqlRelationalTableModel
:存取数据库数据。正如上面所说,若是这些标准模型不能知足你的须要,就必须继承QAbstractItemModel
、QAbstractListModel
或者QAbstractTableModel
,建立本身的模型类。code
Qt 还提供了一系列预约义好的视图:QListView
用于显示列表,QTableView
用于显示表格,QTreeView
用于显示层次数据。这些类都是QAbstractItemView
的子类。这意味着,若是你要建立新的视图类,则能够继承QAbstractItemView
。
QAbstractItemDelegate
则是全部委托的抽象基类。自 Qt 4.4 依赖,默认的委托实现是QStyledItemDelegate
。可是,QStyledItemDelegate
和QItemDelegate
均可以做为视图的编辑器,两者的区别在于,QStyledItemDelegate
使用当前样式进行绘制。在实现自定义委托时,推荐使用QStyledItemDelegate
做为基类,或者结合 Qt style sheets。对象
若是你以为 model/view 模型过于复杂,或者有不少功能是用不到的,Qt 还有一系列方便使用的类。这些类都是继承自标准的视图类,而且继承了标准模型。这些类并非为其余类继承而准备的,只是为了使用方便。它们包括QListWidget
、QTreeWidget
和QTableWidget
。这些类远不如视图类灵活,不能使用另外的模型,所以只适用于简单的情形。