Learning Qt 5! (12):model/view之模型

Qt 学习之路 2(41):model/view 架构
Qt 学习之路 2(42):QListWidget、QTreeWidget 和 QTableWidget
Qt 学习之路 2(43):QStringListModel
Qt 学习之路 2(44):QFileSystemModel
Qt 学习之路 2(45):模型

著名的 MVC 模型!

MVC 是 Model-View-Controller 的简写,即模型-视图-控制器。在 MVC 中,模型负责获取需要显示的数据,并且存储这些数据的修改。每种数据类型都有它自己对应的模型,但是这些模型提供一个相同的 API,用于隐藏内部实现。视图用于将模型数据显示给用户。对于数量很大的数据,或许只显示一小部分,这样就能很好的提高性能。控制器是模型和视图之间的媒介,将用户的动作解析成对数据的操作,比如查找数据或者修改数据,然后转发给模型执行,最后再将模型中需要被显示的数据直接转发给视图进行显示。

MVC

从简单的QListWidget、QTreeWidget和QTableWidget学起!

QListWidget是简单的列表组件。当我们不需要复杂的列表时,可以选择QListWidget。QListWidget中可以添加QListWidgetItem类型作为列表项,QListWidgetItem即可以有文本,也可以有图标。

QTreeWidget,顾名思义,这是用来展示树型结构(也就是层次结构)的。同前面说的QListWidget类似,这个类需要同另外一个辅助类QTreeWidgetItem一起使用。

QTableWidget自然就是用来显示数据表格的啦。

接下来真正开始了解 model/view 模型!

最简单的模型类——QStringListModel,具备向视图提供字符串数据的能力,很多时候都会作为QListView或者QComboBox这种只有一列的视图组件的数据模型。
对照参考:QStringListModel的简单使用

再看看稍复杂的QFileSystemModel。QFileSystemModel是Qt的一个内置模型,还有一个内置模型是QStandardItemModel。

QStandardItemModel是一种多用途的模型,能够让列表、表格、树等视图显示不同的数据结构。这种模型会将数据保存起来。试想一下,列表和表格所要求的数据结构肯定是不一样的:前者是一维的,后者是二维的。因此,模型需要保存有实际数据,当视图是列表时,以一维的形式提供数据;当视图是表格时,以二维的形式提供数据。QFileSystemModel则是另外一种方式。它的作用是维护一个目录的信息。因此,它不需要保存数据本身,而是保存这些在本地文件系统中的实际数据的一个索引。我们可以利用QFileSystemModel显示文件系统的信息、甚至通过模型来修改文件系统。

最后来看看model 的通用概念。
各种model的组织示意图:
model
通过一个例子来看看临时索引(也就是通常使用的索引)QModelIndex类的用法:
tree model

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

模型除了索引之外还有数据角色。

模型可以针对不同的组件(或者组件的不同部分,比如按钮的提示以及显示的文本等)提供不同的数据。例如,Qt::DisplayRole用于视图的文本显示。通常来说,数据项包含一系列不同的数据角色,这些角色定义在Qt::ItemDataRole枚举中

通过指定索引以及角色来获得模型所提供的数据:

QVariant value = model->data(index, role);

Q&A:
1.treeWidget是建在栈上的,root是建在堆上的,这样没有问题吗?

没有问题的。Qt 一般推荐 main() 函数中在栈上建立窗口,而窗口中的组件大多都是在堆上创建的。

猜你喜欢

转载自blog.csdn.net/u013213111/article/details/86174430