模型/视图编程简介
Qt包含一组项目视图类,这些类使用模型视图体系结构来管理数据之间的关系,以及向用户呈现数据的方式。
模型/视图体系结构
模型视图控制器 (MVC) 是一种源自 Smalltalk 的设计模式,在构建用户界面时通常使用。
MVC 由三种对象组成。模型是应用程序对象,View 是它的屏幕表示,控制器定义用户界面对用户输入的反应方式。在 MVC 之前,用户界面设计倾向于将这些对象混为一谈。MVC 将它们分离,以提高灵活性和重用性。
这种分离使得可以在几个不同的视图中显示相同的数据,并实现新的视图类型,而无需更改基础数据结构。为了灵活处理用户输入,引入了委托的概念。在此框架中具有委托的优点是,它允许自定义数据项的呈现和编辑方式。
模型/视图体系结构
该模型与数据源通信,为体系结构中的其他组件提供接口。通信的性质取决于数据源的类型以及模型的实现方式。
视图从模型获取模型索引;这些是对数据项的引用。通过向模型提供模型索引,视图可以从数据源检索数据项。
在标准视图中,委托呈现数据项。编辑项时,委托直接使用模型索引与模型通信。
模型/视图体系结构
该模型与数据源通信,为体系结构中的其他组件提供接口。通信的性质取决于数据源的类型以及模型的实现方式。
视图从模型获取模型索引;这些是对数据项的引用。通过向模型提供模型索引,视图可以从数据源检索数据项。
在标准视图中,委托呈现数据项。编辑项时,委托直接使用模型索引与模型通信。
模型、视图和委托使用信号和插槽相互通信:
来自模型的信号通知视图有关数据源所持有的数据的更改。
视图中的信号提供有关用户与显示的项目的交互的信息。
在编辑过程中,使用来自委托的信号告诉模型,并查看编辑器的状态。
模型:Models
各种模型类都基于QAbstractItemodel类。此类定义视图和委托用于访问数据的接口。数据本身不必存在模型中,可以是单独的类、文件、数据库或其它一些应用程序组件提供的数据结构。
Qt 提供了一些现成的模型,可用于处理数据项:
QStringListModel: 用于存储 QString 项的简单列表。
QStandardItemModel: 管理更复杂的项树结构,每个项都可以包含任意数据。
QFileSystemModel: 提供有关本地归档系统中文件和目录的信息。加载是异步的。
QSqlQueryModel、QSqlTableModel 和 QSqlRelalTableModel 用于使用模型/视图约定访问数据库。
如果以上都不符合自己的需求,则可以继承 QAbstractIteModel 、QAbstractListModel 或QAbstractTableModel 来创建自定义模型。
视图:Views
QListView: 显示项目列表
QTableView: 显示表中模型中的数据
QTreeView: 在分层列表中显示数据的模型项。
每个类都基于 QAbstractItemView 抽象基类。上面那三个类也可以被继承。
委托代理:Delegates
QAbstractItedele 是模型/视图框架中委托的抽象基类。
QStyledItemDelegate 默认委托,Qt 的标准视图将其用作默认委托
但是,QStyledItemDelegate 和 QItemDelegate 是绘画的独立替代方法,为视图中的项目提供编辑器。
QStyledItemDelegate 使用当前样式来绘制其项。因此,建议在实现自定义委托或使用 Qt 样式表时使用 QStyledItemDelegate 作为基类。
排序:Sorting
在模型/视图体系结构中,有两种方法可以接近排序方法,用哪种取决于你的基础模型
如果你的模型是可排序的,也就是重新实现了QAbstractIteModel::sort( )函数,QTableView 和 QTreeView 都提供了一个 API,允许以编程方式对模型数据进行排序。
也可以通过将 QHeaderView::sortIndicatorChanged( ) 信号分别连接到 QTableView:sortByColumn( ) 槽 或QTreeView::sortByColumn( ) 槽,来启用交互式排序(即允许用户通过单击视图的标头对数据进行排序)。
如果模型没有排序的接口,或者希望使用列表视图来显示数据,则替代方法是在视图中显示数据之前使用代理模型来转换模型的结构。
使用模型和视图
Qt中的两个标准模型是QstandardItemodel 和 QFileSystemModel。QStandardIteModel是一个多用途模型,可用于表示列表、表和树视图所需的各种不同数据结构。此模型还保存数据项。QFileSystemModel是一个模型,用于维护有关目录内容的信息。因此,它不保存任何数据项本身,而只是表示本地归档系统中的文件和目录。
将视图与现有模型一起使用
QListView 和 QTreeView类是最适合与 QFileSystemModel 一起使用的视图。
下面的示例在列表视图和树视图中显示相同信息。视图共享用户的选择,所选项在两个视图中突出显示。
模型的构造和使用在单个main()方法中执行:
#include <qapplication.h>
#include <QSplitter> //拆分器小部件