模型/视图
概念
模型/视图结构将数据存储和界面展示分离,分别用不同的类实现
- 模型:存储数据
- 视图:界面上的视图组件显示模型中的数据;在视图组件里修改的数据会被自动保存在模型中
- 源数据
内存中的一个字符串列表
磁盘文件系统结构
数据库的一个数据表
sql查询结果
- 视图(视图组件)
视图从模型获得数据然后将其显示在界面上 QListView QTreeView QTableView
- 模型(数据模型)
模型与源数据通信,并为视图自检提供数据接口
模型从源数据提取需要的数据,用于视图组件进行显示和编辑
模型类 QStringListModel字符串列表模型类 QSqlTableModel数据库中数据表的模型类
- 代理
在视图与模型之间交互操作时提供的临时编辑器
模型向视图提供数据是单向的,一般仅用于显示,当需要在视图上编辑数据时,代理会为编辑数据提供一个编辑器,这个编辑器获取模型的数据、接受用户编辑的数据后又将其提交给模型
(QTableView组件上双击一个单元格来编辑数据时,在单元格里就会出现一个QLineEdit组件,这个编辑框就是代理提供的临时编辑器)
- 通讯方式
模型、视图、代理使用信号和槽进行通信
当源数据发生变化时,模型发射信号通知视图组件
当用户在界面上操作数据时,视图组件发射信号表示操作信息
在编辑数据时,代理会发射信号告知模型和视图组件编辑器的状态
模型
模型数据来源:
- 内存数据(字符串列表等)
- 二维表格型数据
- 数据库中的数据表
其他类、文件、数据库或任何数据源
一种模型数据可以用不同的视图组件来显示数据
界面与原始数据的交互是通过模型来完成的
QAbstractItemModel
所有基于项的模型类都是继承自QAbstractItemModel类
这个类定义了视图组件和代理存取数据的接口
模型只是在内存中临时存储数据
该抽象模型类不能直接用于创建实例对象,常用的模型类如下
// 继承关系
QAbstractItemModel
- QFileSystemModel // 用于表示计算机文件系统的模型类
- QAbstractListModel - QStringListModel // 用于表示字符串列表数据的模型类
- QStandardItemModel // 标准的基于项的模型类,每个项是一个QStandardItem对象
- QAbstractTableModel
- QSqlQueryModel // 用于表述数据库sql查询结果
- QSqlTableModel // 用于表述数据库的一个数据表的模型类
视图
- QListView 用于显示单列的列表数据,一维数据
- QTreeView 用于显示树状结构数据,树状结构数据
- QTableView 用于显示表格数据,二维表格数据
- QColumnView 用于多个QListView 显示树状结构数据
- QUndoView …
xxxView / xxxWidget
xxxView 用于模型/视图结构,每一种视图组件需要相应的一种模型用于存储数据
xxxWidget是xxxView的子类,直接使用item来存储数据,称为视图类的便利类
视图组件的数据来源于模型
视图组件不存储模型
便利类为组件的每个节点或单元格创建一个项,用项存储数据 (QTableWidget这个便利类,表格的每个单元格关联一个QTableWidgetItem对象)
便利类没有模型,实际上是用项的方式代替模型的功能,将界面与数据进行绑定
便利类缺乏对大型数据源进行灵活处理的能力,只适用于小型数据的显示和编辑
视图组件则会根据模型的数据内容自动显示,有助于减少编程工作量,使用更灵活
// 继承关系
QAbstractItemView
- QListView
- QUndoView
- QListWidget
- QTreeView
- QTreeWidget
- QTableView
- QTableWidget
- QColumnView
视图与模型
调用视图类的setModel()函数为视图组件设置一个模型,模型的数据就可以显示在视图组件上了
在视图组件上修改数据后,数据可以自动保存到模型中