CSDN话题挑战赛第2期
参赛话题:学习笔记
欢迎小伙伴的点评✨✨,相互学习c/c++应用开发。🍳🍳🍳
博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩🚀
前言
本章节会给大家带来模型/视图结构的概述及文件目录浏览器的实例。
一、模型/视图结构概述
MVC 设计模式是起源于 Smalltalk 的一种与用户界面相关的设计模式。通过使用此模式,可以有效地分离数据和用户界面。 MVC 设计模式包括三个元素:表示数据的模型 (Model) 、表示用户界面的视图 (View) 和定义了用户在界面上操作的控制器 (Controller) 。与 MVC 设计模式类似, Qt 引入了模型/视图结构用于完成数据与界面的分离,即 InterView框架。但不同的是, Qt 的 InterView 框架把视图和控制器部件结合在一起,使得框架更为简洁。
为了灵活地处理用户输入, InterView 框架引入了代理 (Delegate) 。通过使用代理,能够自定义数据条目 Cltem) 的显示和编辑方式。Qt 的模型/视图结构分为三部分:模型 (Model) 、视图 (View)和代理 (Delegate) 。其中,模型与数据源通信,并为其他部件提供接口;而视图从模型中获得用来引用数据条目的模型索引 (ModelIndex) 。在视图中,代理负责绘制数据条目,当编辑条目时,代理和模型直接进行通信。模型/视图/代理之间通过信号和槽进行通信。
- 数据发生改变时,模型发出信号通知视图。
- 用户对界面进行操作,视图发出信号。
- 代理发出信号告知模型和视图编辑器目前的状态。
1.1、基本概念
- 模型 (Model)
Interview 框架中的所有模型都基于抽象基类 QAbstractltemModel, 此类由 QProxyModel 、QAbstractListModel 、QAbstractTableModel, QAbstractProxyModel, QDirModel 、 QFileSystemModel 、QHelpContentModel 和 QStandardltemModel 类继承。其中, QAbstractListModel 类和 QAbstractTableModel 类是列表和表格模型的抽象基类,如果需要实现列表或表格模型,则应从这两个类继承 。 完成 QStringList 存储的 QStringListModel 类继承自 QAbstractListModel 类,而与数据库有
关的 QSqlQueryModel 类继承自 QAbstractTableModel 类 QAbstractProxyModel 类是代理模型的抽象类; QDirModel 类是文件和目录的存储模型 - 视图 (View)
InterView 框架中的所有视图都基于抽象基类 QAbstractltemView, 此类由 QColumnView 、QHeaderView 、 QListView 、 QTableView 和 QTreeView 类继承。其中, QListView 类由 QUndoView类和 QListWidget 类继承; QTableView 类由 QTableWidget 类继承; QTreeView 类由 QTreeWidget 类继承 。 而 QListWidget 类 QTableWidget 类和 QTreeWidget 类实际上已经包含了数据,是模型/视图集成在一起的类 。 - 代理 (Delegate)
Interview 框架中的所有代理都基于抽象基类 QAbstractltemDelegate, 此类由 QltemDelegate和 QStyledItemDelegate 类继承 。 其中, QltemDelegate 类由表示数据库中关系代理的QSqlRelationalDelegate 类继承。
二、视图效果实例
图一
三、原码解析
3.1、InterView 框架解析
InterView 框架提供了 一 些可以直接使用的模型类和视图类,如 QStandardltemModel 类、QDirModel 类、 QStringListModel 类,以及 QColumnView 类、 QHeaderView 类、 QListView 类、QTableView 类和 QTreeView 类等。
main.cpp
#include <QApplication>
#include <QDirModel>
#include <QTreeView>
#include <QListView>
#include <QTableView>
#include <QSplitter>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QDirModel model; // 新建一个 QDirModel 对象,为数据访问做准备 。
//QDirModel 的创建还可以设置过滤器,即只有符合条件的文件或目录才可被访问 。
/*新建三种不同的 View 对象,以便文件目录可以以三种不同的方式显示*/
QTreeView tree;
QListView list;
QTableView table;
tree.setModel(&model);
list.setModel(&model); //调用 setModelO函数设置 View 对象的 Model 为 QDirModel 对象的 model 。
table.setModel (&model);
QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&list,
SLOT(setRootindex(QModelIndex)));
QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&table,
SLOT(setRootIndex(QModelIndex)));
/*为了实现双击 QTreeView 对象中的某个目录时,
QListView 对象和 QTableView 对象中显示此选定目录下的所有文件和目录,需要连接 QTreeView
对象的 doubleClicked()信号与 QListView 对象和 QTableView 对象的 setRootlndexO槽函数。*/
QSplitter *splitter= new QSplitter;
splitter->addWidget(&tree);
splitter->addWidget(&list);
splitter->addWidget(&table);
splitter->setWindowTitle(QObject::tr("Model/View"));
splitter->show () ;
return a.exec();
}
四、总结
模型/视图结构会在应用程序开发中经常用到的