Model-View结构

本文最后更新于:2022年6月14日 晚上

  • 数据:如数据库的一个数据表或SQL查询结果,内存中的一个 StringList,或磁盘文件结构等。
  • Model:与数据通信,并为视图组件提供数据接口。
  • View:是屏幕上的界面组件,视图从数据模型获得每个数据项的模型索引(model index),通过模型索引获取数据。
  • 代理:定制数据的界面显示和编辑方式。在标准的视图组件中,代理功能显示一个数据,当数据被编辑时,提供一个编辑器,一般是 QLineEdit。
flowchart TD
	A[数据] <--> B[Model]
	B --显示--> C[View]
	B <--编辑--> D((代理))
	D <--显示--> C
	style A stroke-dasharray: 5 5

模型、视图和代理之间使用信号和槽通信。


数据类型

Model 类 用途
QStringListModel 用于处理字符串列表数据的数据模型类
QStandardItemModel 标准的基于项数据的数据模型类,每个项数据可以是任何数据类型
QFileSystemModel 计算机上文件系统的数据模型类
QSortFilterProxyModel 与其他数据模型结合,提供排序和过滤功能的数据模型类
QSqlQueryModel 用于数据库SQL查询结果的数据模型类
QSqlTableModel 用于数据库的一个数据表的数据模型类
QSqlRelationalTableModel 用于关系型数据表的数据模型类
graph LR
	QAbstractItemmodel --> QAbstractListModel
	QAbstractListModel --> QStringListModel
	QAbstractItemmodel --> QAbstractProxyModel
	QAbstractProxyModel --> QSortFilterProxyModel
	QAbstractItemmodel --> QAbstractTableModel
	QAbstractTableModel --> QSqlQueryModel --> QSqlTableModel --> QSqlRelationalTableModel
	QAbstractItemmodel --> QStandardItemModel
	QAbstractItemmodel --> QFileSystemModel
	style QAbstractItemmodel fill:#a5ab1e,color:#fff
	style QAbstractListModel fill:#a5ab1e,color:#fff
	style QAbstractProxyModel fill:#a5ab1e,color:#fff
	style QAbstractTableModel fill:#a5ab1e,color:#fff
	style QStringListModel fill:#eb5d22,color:#fff
	style QSortFilterProxyModel fill:#eb5d22,color:#fff
	style QSqlQueryModel fill:#eb5d22,color:#fff
	style QSqlTableModel fill:#eb5d22,color:#fff
	style QSqlRelationalTableModel fill:#eb5d22,color:#fff
	style QStandardItemModel fill:#eb5d22,color:#fff
	style QFileSystemModel fill:#eb5d22,color:#fff

视图组件:显示数据时,只需调用视图类的 setModel() 函数

  • 视图组件不存储数据
  • 便利类则为组件的每个节点或单元格创建一个项(Item),用项存储数据、格式设置等。
  • 便利类没有数据类型,将界面与数据绑定了。
graph LR
QAbstactItemView --> QListView --> QListWidget
QAbstactItemView --> QTableView --> QTableWidget
QAbstactItemView --> QTreeView --> QTreeWidget
QAbstactItemView --> QColumnView
QAbstactItemView --> QHeaderView
style QAbstactItemView fill:#a5ab1e,color:#fff
style QListView fill:#eb5d22,color:#fff
style QListWidget fill:#eb5d22,color:#fff
style QTableView fill:#eb5d22,color:#fff
style QTableWidget fill:#eb5d22,color:#fff
style QTreeView fill:#eb5d22,color:#fff
style QTreeWidget fill:#eb5d22,color:#fff
style QColumnView fill:#eb5d22,color:#fff
style QHeaderView fill:#eb5d22,color:#fff

便利类缺乏对大型数据源进行灵活处理的能力,适用于小型数据的显示和编辑。


代理

  • 代理就是在视图组件上为编辑数据提供编辑器
  • 如在表格组件中编辑一个单元格的数据时,缺省是使用一个 QLineEdit 编辑框。代理负责从数据模型获取相应的数据,然后显示在编辑器里,修改数据后,又将其保存到数据模型中。
  • QAbstractItemDelegate 是所有代理类的基类,

Model/View结构的一些概念

数据模型中存储数据的基本单元都是项(Item),每个项有一个行号、一个列号,还有一个父项

QModelIndex 表示模型索引的类。模型索引提供数据存取的一个临时指针。

1
2
3
4
5
// Table Model
QModelIndex indexA = model->index(0, 0, QModelIndex());
QModelIndex indexC = model->index(2, 1, QModelIndex());
// Tree Model
QModelIndex indexB = model->index(1, 0, indexA);

项的角色:在为数据模型的一个项设置数据时,可以赋予其不同项的角色的数据。

模型中的每个项都有一组与其关联的数据元素,每个元素都有自己的角色。视图使用这些角色向模型指示它需要哪种类型的数据。

1
2
3
void QStandardItem::setData(const QVariant& value, int role = Qt::UserRole + 1);

QVariant QStandardItem::data(int role = Qt::UserRole + 1) const;

Model-View结构
https://tian-sj.github.io/2022/05/30/Model-View结构/
作者
田世纪
发布于
2022年5月30日
许可协议