Model/View——(一)简介和基本概念

一、Model/View (模型/视图)结构是Qt中用界面组件显示与编辑数据的一种结构,视图(View)是显示和编辑数据的界面组件,模型(Model)是视图与原始数据之间的接口。

二、基本原理

在这里插入图片描述

- 数据:是实际的数据,如数据库的一个数据表或SQL查询结果,内存中的一个StringList,或磁盘文件结构等。

- 视图或视图组件:是屏幕上的界面组件,视图从数据模型获得每个数据项的模型索引(model index),通过模型索引获取数据,然后为界面组件提供显示数据。Qt提供一些现成的数据视图组件,如QListView、QTreeView和QTableView等。

- 模型或数据模型:与实际数据通信,并为视图组件和代理提供存取数据的标准接口。它从原始数据提取需要的内容,用于视图组件进行显示和编辑。Qt中有一些预定义的是数据模型,如QStringListModel可作为StringList的数据模型,QSqlTableModel可以作为数据库中一个数据表的数据模型。

一个数据模型可以在不同的视图中显示,也可以在不修改数据模型的情况下,设计特殊的视图组件。

- 代理:可以让用户定制数据的界面显示和编辑方式。在标准的视图组件中,代理功能显示一个数据,当数据被编辑时,代理通过模型索引与数据模型通信,并为编辑数据提供一个编辑器,一般是一个QLineEdit组件

模型、视图和代理之间使用信号和槽通信。当源数据发生变化时,数据模型发射信号通知视图组件;当用户在界面上操作数据时,视图组件发射信号表示这些操作信息;当编辑数据时,代理发射信号告知数据模型和视图组件编辑器的状态。

三、数据模型

所有的基于项数据的数据模型都是基于QAbstractItemModel类的,这个类定义了视图组件和代理存取数据的接口。数据无需存储在数据模型里,数据可以是其他类、文件、数据库或任何数据源。

Qt中与数据模型相关的几个主要的类的层次结构

在这里插入图片描述

- QStringListModel:用于处理字符串列表数据的数据模型

- QStandardItemModel:标准的基于项数据的数据模型类,每个项数据可以是任何是数据类型

- QFileSystemModel:计算机上文件系统的数据模型类

- QSortFilterProxyModel:与其他数据模型结合,提供排序和过滤功能的数据模型类

- QSqlQueryModel:用于数据库SQL查询结果的数据模型类

- QSqlTableModel:用于数据库的一个数据表的数据模型类

- QSqlRelationalTableModel:用于关系型数据表的数据模型类

如果这些现有的模型类无法满足用户需求,可以从QAbstractItemModel、QAbstractListModel或QAbstractTableModel继承。生成自己定制的数据模型类。

注意:抽象类是不能直接使用的,需要由子类继承来实现一些纯虚函数。

四、视图组件

在这里插入图片描述

- QListView:用于显示单列大的列表数据,适用于一维数据的操作

- QTreeView:用于显示树状结构数据,适用于树状结构数据的操作

- QTableView:用于显示表格状数据,适用于二维表格型数据的操作

- QColumnView:用多个QListView显示树状层次结构,树状结构的一层用一个QListView显示

- QHeaderView:提供行表头或列表头的视图组件,如QTableView的行表头和列表头

视图组件在显示数据时,只需调用视图类的==setModel()==函数,为视图组件设置一个数据模型就可以实现视图组件与数据模型之间的关联,在视图组件上的修改将自动保存到相关联的数据模型里,一个数据模型可以同时在多个视图组件里显示数据。

QListWidget、QTreeWidget、QTableWidget分别为3个视图类的子类,称为便利类,其为组件的每个节点或单元格创建一个项,用项存储数据、格式设置等,所以便利类没有数据模型,它实际上是用项的方式集成了数据模型的功能。

五、代理

代理就是在视图组件上为编辑数据提供编辑器。代理负责从数据模型获取相应的数据,然后显示在编辑器里,修改数据后,又将其保存到数据模型中。

QAbstractItemDelegate是所有代理类的基类,不能直接使用。它的一个子类QStyleItemDelegate是Qt的视图组件缺省使用的代理类,可以从QStyleItemDelegate继承创建自定义代理类

六、相关概念

所有的数据模型类都从QAbstractItemModel继承而来,不管底层的数据结构是如何组织数据的,QAbstractItemModel的子类都以表格的层次结构表示数据,视图组件通过这种规则来存取模型中的数据,但是表现给用户的形式不一样。

常见的数据模型表现形式

在这里插入图片描述

数据模型中存储数据的基本单元都是项,每个项有一个行号、列号,还有一个父项,由这三个参数完全可以定义一个项的位置,从而存取项的数据。所有的项都有一个相同的顶层项(Root item)。

数据模型

通过数据模型存取的每个数据都有一个模型索引,视图组件和代理都通过模型索引来获取数据。

QModelIndex表示模型索引的类。模型索引提供数据存取的同一个临时指针,用于通过数据模型提取或修改数据。(因为模型内部组织数据的结构随时可能改变,所以模型索引是临时的,如果需要使用持久性的模型索引,则要使用QPersistentModelIndex类。)

要获得一个模型索引,必须提供3个参数:行号、列号、父项的模型索引。例如上述Table Model中的三个数据项A、B、C,获取其模型索引的代码为

QModelIndex indexA = model->index(0,0,QModeIndex());//对于列表和表格模式的数据模型,顶层节点总是用QModelIndex()表示
QModelIndex indexB = model->index(1,1,QModeIndex());
QModelIndex indexC = model->index(2,1,QModeIndex());

父项:当数据模型是列表或表格时,所有的数据项的父项就是顶层项;当数据模型是树状结构时,一个项称为一个结点,一个结点可以有父结点,也可以是其他节点的父节点,在构造数据项的模型索引时,必须指定正确的行号、列号和父节点。例如上述Tree Model中的三个数据项A、B、C,获取其模型索引的代码为

QModelIndex indexA = model->index(0,0,QModeIndex());
QModelIndex indexB = model->index(1,0,indexA);
QModelIndex indexC = model->index(2,1,QModeIndex());

项的角色

在为数据模型的一个项设置数据时,可以赋予其不同项的角色的数据。列如,数据模型类QStandardItemModel的项数据类是QStandardItem,其设置数据的函数是

void QStandardItem::setData(const QVarint &value, int role = Qt::UserRole + 1)
/*
value:需要设置的值
role:设置数据的角色,一个项可以有不同角色的数据,用于不同场合
*/
/*
role 是Qt::ItemDataRole枚举类型,有多种取值,如Qt::DisplayRole角色是在视图组件中显示的字符串,
Qt::ToolTipRole是鼠标提示消息,Qt::UserRole可以自定义数据,项的标准角色是Qt::DisplayRole。
*/
//在获取一个项的数据时也需要指定角色,以获取不同角色的数据。
QVarint QStandardItem::data(int role = Qt::UserRole + 1) const

在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值