目录
MVC
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:
Model(模型)表示应用程序核心(比如数据库记录列表)。
View(视图)显示数据(数据库记录)。
Controller(控制器)处理输入(写入数据库记录)。
MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。View(视图)是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。Controller(控制器)是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。
MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。
MVD
model、view、delegate 之间的作用关系简单概括如下:
1)model和data相互通信,然后model为view和delegate提供接口。
2)view通过调用model的接口,从model中获取模型索引QModelIndex,通过QModelIndex可以获得data。
3)delegate为view展示data,delegate可以被编辑修改删除。而当在delegate上编辑时,它会用QModelIndex于model通信,通知model更新数据。从这里可以看出来,view和delegate都可以使用QModelIndex,但是view只能使用QModelIndex进行读取,delegate只能修改。
Model:所有model都基于QAbstractItemModel类。该类定义了view和delegate用于访问data的接口。data本身不必存储在model中,它可以存储在由单独的类、文件、数据库或其他数据结构中。Qt提供了一些现成的model:
1)QStringListModel:用于存储简单的QString列表。
2)QStandardItemModel:适用于各种结构,每个项都可以包含任意数据。
3)QFileSystemModel:提供有关本地归档系统中的文件和目录的信息。
4)QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel:用于访问数据库。
同时也可以子类化QAbstractItemModel、QAbstractListModel或QAbstractTableModel来创建自定义模型。
Views:QListView列表视图,QTableView表格视图,QTreeView树形视图。
Delegates:QAbstractItemDelegate是模型/视图框架中委托的抽象基类。默认委托实现由QStyledItemDelegate提供,Qt的标准视图将其用作默认委托。如果需要展示更复杂的数据,需要我们重写Delegates。
模型视图中的方便类:QListWidget、QTreeWidget和QTableWidget。这些类不如视图类灵活,不能与任意模型一起使用。
效果图
main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QAbstractItemModel>
#include <QAbstractItemView>
#include <QItemSelectionModel>
#include <QDirModel>
#include <QTreeView>
#include <QListView>
#include <QTableView>
#include <QSplitter>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QDirModel model;
//新建三种不同view对象,文件目录以三种不同方式显示
QTreeView tree;
QListView list;
QTableView tabel;
//设置view对象
tree.setModel(&model);
list.setModel(&model);
tabel.setModel(&model);
//设置选择模型
tree.setSelectionMode(QAbstractItemView::MultiSelection);//设置为多选
list.setSelectionModel(tree.selectionModel());//设置与tree相同的选择模型
tabel.setSelectionModel(tree.selectionModel());//设置与tree相同的选择模型
//事件关联
QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&list,
SLOT(setRootIndex(QModelIndex)));//双击某个目录时,显示此目录下的所有文件目录
QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&tabel,
SLOT(setRootIndex(QModelIndex)));
//采用分割窗口布局
QSplitter *splitter = new QSplitter;
splitter->addWidget(&tree);
splitter->addWidget(&list);
splitter->addWidget(&tabel);
splitter->setWindowTitle(QStringLiteral("模型/视图"));
splitter->setWindowIcon(QIcon("icon.png"));
splitter->setMinimumSize(900,600);
splitter->show();
//MainWindow w;
//w.show();
return a.exec();
}
参考
https://baike.baidu.com/item/MVC%E6%A1%86%E6%9E%B6/9241230?fromtitle=mvc&fromid=85990&fr=aladdin
https://blog.csdn.net/wei375653972/article/details/86574356