Qt5开发从入门到精通——第八篇一节(模型/视图结构—— 文件目录浏览器)

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、基本概念

  1. 模型 (Model)
    Interview 框架中的所有模型都基于抽象基类 QAbstractltemModel, 此类由 QProxyModel 、QAbstractListModel 、QAbstractTableModel, QAbstractProxyModel, QDirModel 、 QFileSystemModel 、QHelpContentModel 和 QStandardltemModel 类继承。其中, QAbstractListModel 类和 QAbstractTableModel 类是列表和表格模型的抽象基类,如果需要实现列表或表格模型,则应从这两个类继承 。 完成 QStringList 存储的 QStringListModel 类继承自 QAbstractListModel 类,而与数据库有
    关的 QSqlQueryModel 类继承自 QAbstractTableModel 类 QAbstractProxyModel 类是代理模型的抽象类; QDirModel 类是文件和目录的存储模型
  2. 视图 (View)
    InterView 框架中的所有视图都基于抽象基类 QAbstractltemView, 此类由 QColumnView 、QHeaderView 、 QListView 、 QTableView 和 QTreeView 类继承。其中, QListView 类由 QUndoView类和 QListWidget 类继承; QTableView 类由 QTableWidget 类继承; QTreeView 类由 QTreeWidget 类继承 。 而 QListWidget 类 QTableWidget 类和 QTreeWidget 类实际上已经包含了数据,是模型/视图集成在一起的类 。
  3. 代理 (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();
}

四、总结

模型/视图结构会在应用程序开发中经常用到的

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东.'

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值