Qt笔记——模型/视图MVD 文件目录浏览器软件

目录

MVC

MVD

效果图

​main.cpp

参考


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

发布了242 篇原创文章 · 获赞 237 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_41895747/article/details/104074889