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 |
|
项的角色:在为数据模型的一个项设置数据时,可以赋予其不同项的角色的数据。
模型中的每个项都有一组与其关联的数据元素,每个元素都有自己的角色。视图使用这些角色向模型指示它需要哪种类型的数据。
1 |
|
Model-View结构
https://tian-sj.github.io/2022/05/30/Model-View结构/