MVC是Model-View-Controller,即模型(Model)、视图(View)、控制器(Controller)。
模型:用于管理数据;
视图:就是呈现在用户面前的界面外观,视图负责把模型中的数据显示给用户;
控制器:用于处理用户在用户界面的输入;
MVC本质上目的是数据处理和显示分离,以提高灵活性和重用性。
1、Qt引入新模型/视图结构
Qt 把视图和控制器组合在一起,从而形成模型/视图结构,如下图:
委托(也称代理)即Delegate,用于在Qt模型/视图架构中处理特定类型的数据。委托提供了一种方便的方法来定制特定类型的数据的显示和编辑,使得开发人员能够更好地控制数据的外观和行为。
至此,诞生新结构,MVD即Model-View-Delegate,由于模型负责组织数据,而视图负责显示数据,所以当用户想修改显示的数据时,就要通过视图中的委托来完成。
2、数据与模型
数据不一定需要存储在模型中,数据也可以存储在文件、数据库等其他地方,存储的数据不一定拥有一种数据结构,但是模型通常会把这些数据组织成一种数据结构(比如列表(list)结构、树形(tree 结构等),这种结构只是逻辑上的结构,数据本身不一定拥有这种结构,然后视图根据模型提供的逻辑结构显示数据,比如列表视图(QListView)可以显示把数据组织成列表结构的模型 (QStandardItemModel 模型实现了该种结构)中的数据;
当然,也可以使用列表视图显示组织为树形结构的数据,但这样做需要做一些比较麻烦的处理才能正确显示。
3、MVD通信方式
使用Qt的信号和槽通信
4、MVD示例:
//上图红色为标头--------------------------------------视图
//蓝色所指为网格线-----------------------------------视图
//上图绿色方框内为委托某个组件在编辑单元格内容---------------委托
模型:表格中的数据都是由模型管理的;
视图:负责管理水平/垂直标头、滚动、对数据项的 选择、网格线等;
委托:负责单元格(数据项)的 绘制,以及编辑单元格的内容;
5、MVD常见类
5.1模型:
Qt 使用抽象类 QAbstractItemModel 来描述模型,所有的模型都是通过子类化该抽像类而实现的。
- QStringListModel:用于存储 QString 项目的列表。
- QStandardItemModel:该模型可以被当作列表模型、表格模型、树模型来使用。
- QFileSystemModel:该模型提供本地文件系统中的文件和目录信息,模型本身没有任何的数据项目。
- QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel 与数据库有关。
5.2视图:
Qt 使用抽象类 QAbstractItemView 来描述视图,所有的视图都是通过子类化该抽像类而实现的。
- QListView(列表视图)
- QTableView(表格视图)
- QTreeView(树视图)等
5.3委托:
Qt 使用抽象类 QAbstractItemDelegate 来描述委托。
Qt 实现了两个委托类QStyledItemDelegate 和 QItemDelegate,这两个委托之中只能使用其中一个,其区别在 于 QItemDelegate 总是使用一种默认的样式绘制数据项,而 QStyledItemDelegate 使用当前的样式来绘制数据项,通常使用的是 QStyledItemDelegate。
6、代码演示
文章来源:https://www.toymoban.com/news/detail-608014.html
文章来源地址https://www.toymoban.com/news/detail-608014.html
QStandardItemModel model(3,3,this); //创建一个 3 行 3 列的表格结构的模型
QTableView v1; //创建一个表格视图
//设置模型的数据,使用索引的形式设置每个数据项的值
model.setData(model.index(0,0),123);
model.setData(model.index(0,1),222);
model.setData(model.index(0,2),333);
model.setData(model.index(1,0),444);
model.setData(model.index(1,1),555);
model.setData(model.index(1,2),666);
model.setData(model.index(2,0),777);
model.setData(model.index(2,1),888);
model.setData(model.index(2,2),999);
v1.setModel(&model); //设置视图 v1 的模型
v1.show(); //显示视图
到了这里,关于Qt6之模型和视图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!