MVC软件设计模式及QT的MVC架构

news2024/9/17 9:08:13

目录

引言

一、MVC思想介绍

1.1 MCV模型概述

1.2 Excel的处理数据

1.3 MVC模式的优势

二、QT中的MVC

1.1 模型(Model)

1. QAbstractItemModel

2. QStringListModel

3. QStandardItemModel

4. QSqlTableModel 和 QSqlQueryModel

5. QAbstractListModel

6. QAbstractProxyModel

7. QStyledItemDelegate

1.2 视图(View)

1. QAbstractItemView

2. QListView

3. QTableView

4. QTreeView

5. 视图类的使用

1.3 委托(Delegate)

1. QItemDelegate类

2. QStyledItemDelegate类

3. 比较

4. 委托类的使用

三、简单的实例

四、结论


引言

在现代软件开发中,MVC(Model-View-Controller)编程模式因其清晰的结构和高效的开发流程而广受青睐。MVC不仅促进了代码的组织和复用,还提高了应用程序的可扩展性和可维护性。本文将深入探讨MVC模式的思想、原理、组成部分、QT中的MVC以及实现简单示例。

一、MVC思想介绍

1.1 MCV模型概述

MVC是一种将应用程序分为三个核心部分的软件设计模式:模型(Model)、视图(View)和控制器(Controller)。这三个部分各自负责不同的职责,通过明确的接口相互通信,共同协作完成应用程序的功能。

  • 模型(Model):负责应用程序的数据和业务逻辑。它代表数据和业务规则,是应用程序的核心。模型接收输入数据,处理业务逻辑,然后返回处理结果。模型与数据库交互,封装了数据的访问逻辑。

  • 视图(View):负责数据的展示和用户界面的渲染。视图从模型接收数据,并将其以用户友好的方式呈现给用户。视图不处理业务逻辑,只是展示数据。

  • 控制器(Controller):作为模型和视图之间的桥梁,处理用户的输入,并调用模型和视图去完成用户的请求。控制器接收用户的输入(如点击按钮、提交表单等),决定使用哪个模型来处理请求,并选择合适的视图来展示结果。

1.2 Excel的处理数据

通过一个简单的例子来理解什么是MVC架构的思想。

以上是一个Excel表格有学生的成绩,在Excel应用中绘制其树状图和折线图。

当修改Excel表格中的数据,树状图和折线图也会随之更改。

简单来说:

模型(Model):就是Excel表格的数据存储;

视图(View):就是树状图和折线图的视图界面;

控制器(Controller):就是处理输入,并更新模型和视图。

1.3 MVC模式的优势

  1. 高内聚低耦合:MVC模式通过将应用程序的不同部分分离,降低了它们之间的耦合度,提高了模块的内聚性,使得修改和扩展变得更加容易。

  2. 易于维护:由于MVC模式将应用程序的不同职责分配给不同的组件,因此当需要修改应用程序时,可以更容易地定位到需要修改的部分,而不会影响到其他部分。

  3. 可重用性:模型和控制器可以被多个视图重用,提高了代码的重用性。

  4. 清晰的分工:MVC模式明确了开发人员之间的分工,提高了开发效率。

二、QT中的MVC

在QT中的 控制器 Controller改了个单词 委托 Delegate,就只是简单改了个单词,性质的一样的。

1.1 模型(Model)

在Qt中,MVC(Model-View-Controller)架构的Model部分负责管理和存储数据,以及提供数据访问的接口。Qt框架提供了一系列的Model类来支持这种架构,这些类通常继承自QAbstractItemModel或它的子类。以下是一些关键的Qt Model类及其特点:

1. QAbstractItemModel
  • 概述:这是所有模型类的基类,定义了模型必须实现的基本接口。由于它是一个抽象类,通常不直接使用,而是使用它的子类。
  • 功能:提供了模型与视图之间进行数据交互的接口,如index()parent()rowCount()columnCount()等方法。
2. QStringListModel
  • 概述:这是一个简单的模型类,用于存储和提供QString列表给视图。
  • 特点:适用于需要在视图小部件(如QListViewQComboBox)中显示许多字符串的简单情况。
  • 使用场景:当应用程序需要从列表中显示一组字符串时,可以使用QStringListModel
3. QStandardItemModel
  • 概述:这是一个更通用的模型类,提供了用于存储和管理项目数据的标准方式。
  • 特点:支持多维数据(行和列),可以包含不同类型的项(如文本、图标等)。
  • 使用场景:适用于需要表格、列表或树形结构显示数据的复杂情况。
4. QSqlTableModel 和 QSqlQueryModel
  • 概述:这两个类专门用于与数据库交互,将SQL查询的结果集作为模型数据。
  • 特点
    • QSqlTableModel:自动处理多个SQL查询,但通常适用于具有简单表结构的情况。
    • QSqlQueryModel:允许执行自定义的SQL查询,并将结果集映射为模型数据。
  • 使用场景:当应用程序需要从数据库中检索数据并在视图中显示时,可以使用这些类。
5. QAbstractListModel
  • 概述:这是一个一维列表模型的基类,提供了处理一维数据列表的接口。
  • 特点:比QStringListModel更灵活,可以存储任何类型的数据项。
  • 使用场景:当需要自定义一维列表模型时,可以继承QAbstractListModel
6. QAbstractProxyModel
  • 概述:这是一个代理模型的基类,用于对原始模型的数据进行转换(如排序、过滤等)。
  • 子类:包括QSortFilterProxyModel(提供排序和过滤功能)和QIdentityProxyModel(不进行任何修改的代理)。
  • 使用场景:当需要对模型数据进行排序、过滤或其他转换时,可以使用代理模型。
7. QStyledItemDelegate
  • 概述:虽然QStyledItemDelegate不是直接的Model类,但它在MVC架构中扮演了重要角色,用于自定义视图中项的显示和编辑。
  • 特点:支持样式表,允许轻松地定制渲染。
  • 使用场景:当需要自定义视图中项的渲染方式时,可以继承QStyledItemDelegate

Qt中的MVC Model类提供了丰富的接口和类来支持数据的存储、管理和显示。通过继承和使用这些类,开发者可以轻松地实现复杂的用户界面和数据交互逻辑。在选择Model类时,应根据应用程序的具体需求和数据的特性来决定。

1.2 视图(View)

在Qt中,MVC(Model-View-Controller)架构的View类负责数据的可视化展示,即将模型(Model)中的数据以图形界面的形式呈现给用户。Qt提供了一系列现成的View类,这些类都基于QAbstractItemView抽象基类,用于实现不同的数据展示方式。以下是对Qt中MVC的View类的详细介绍:

1. QAbstractItemView
  • 作用QAbstractItemView是所有视图类的抽象基类,它定义了视图类所需的基本接口和功能。
  • 特点
    • 提供了视图的基本属性,如选择模式、滚动模式、拖拽支持等。
    • 允许子类通过重写虚函数来自定义视图的行为。

Qt提供了几种具体的View类,以满足不同的数据展示需求:

2. QListView
  • 作用:显示一个项目列表,每个项目占据一行。
  • 特点:支持单选、多选等选择模式,可以通过设置不同的模式来改变用户的选择行为。
3. QTableView
  • 作用:在表格中显示模型中的数据,每个数据项占据一个单元格。
  • 特点:支持行选择、列选择或单元格选择,可以自定义表头、列宽、行高等。
  • 功能:通过setAlternatingRowColors等函数可以设置表格的交替行颜色,提高可读性。
4. QTreeView
  • 作用:在分层列表中显示模型数据项,通常用于展示具有层级关系的数据。
  • 特点:支持展开/折叠节点,可以根据需要显示或隐藏子项。
5. 视图类的使用
  • 设置模型:通过调用视图的setModel函数,将模型与视图关联起来。这样,视图就可以从模型中获取数据并进行展示了。
  • 自定义视图:如果需要自定义视图的展示方式,可以通过继承QAbstractItemView或现有的视图类,并重写相关函数来实现。
  • 处理用户交互:视图类提供了丰富的信号和槽机制,用于处理用户的交互操作,如选择项的改变、拖拽操作等。

Qt中的MVC架构中的View类提供了丰富的数据展示方式,通过继承QAbstractItemView或现有的视图类,并设置模型,可以轻松地实现数据的可视化展示。同时,视图类还提供了丰富的信号和槽机制,用于处理用户的交互操作。

1.3 委托(Delegate)

在Qt的MVC(Model-View-Controller)架构中,虽然Qt官方更偏向于使用Model-View架构(因为Qt没有直接实现一个完整的Controller层,但你可以通过其他方式如信号和槽机制来模拟Controller的行为),Delegate类是一个非常重要的组成部分,它允许你自定义视图(View)中数据的显示和编辑方式。

QStyledItemDelegate类和QItemDelegate类都是Qt框架中用于自定义和控制项视图控件(如QListView、QTableView、QTreeView)中项的显示和编辑的委托类。它们提供了对项的外观和编辑行为的定制能力,但两者之间存在一些关键的区别。

1. QItemDelegate类
  • 功能:QItemDelegate是Qt中较早期的委托类,用于处理视图中项的显示和编辑。它继承自QAbstractItemDelegate,并提供了默认的绘制和编辑功能。
  • 绘制功能:QItemDelegate使用QStyle进行绘制,这意味着它的绘制风格是基于系统的默认风格。
  • 编辑功能:它提供了默认的编辑器(如文本框、复选框等)和编辑行为。
  • 自定义性:可以通过重写paint和createEditor等虚函数来自定义项的显示和编辑行为。
  • 使用场景:尽管在Qt 4.4之后引入了QStyledItemDelegate,但在一些需要兼容旧版本Qt或特定绘制风格的场景中,QItemDelegate仍然是一个可用的选择。
2. QStyledItemDelegate类
  • 功能:QStyledItemDelegate是Qt 4.4引入的,旨在替代QItemDelegate,提供更灵活和现代的项委托。它也是继承自QAbstractItemDelegate,并使用QStyle进行绘制。
  • 增强功能
    • 绘制机制:QStyledItemDelegate利用了QStyle的高级功能,可以更好地支持复杂的UI元素和现代风格。
    • 统一的风格:它能更好地与Qt的样式系统集成,确保在不同平台和风格下的外观一致性。
    • 简化的自定义:提供了一些额外的虚函数(如initStyleOption),使自定义项的显示和编辑更加简单和灵活。
  • 使用场景:QStyledItemDelegate是Qt推荐的用于自定义项视图控件中项的显示和编辑的委托类,特别是在需要现代和灵活的绘制风格时。
3. 比较
特性QItemDelegateQStyledItemDelegate
引入时间早期Qt 4.4
绘制机制使用QStyle进行绘制,基于系统默认风格利用QStyle的高级功能,支持更复杂和现代的UI元素
自定义性可以通过重写paint和createEditor等虚函数来自定义提供更多虚函数和工具函数,使自定义更加简便和灵活
使用场景兼容旧版本Qt或特定绘制风格现代和灵活的绘制风格需求

在选择使用QItemDelegate还是QStyledItemDelegate时,应根据项目需求、Qt版本兼容性以及所需的绘制风格等因素进行综合考虑。在大多数情况下,推荐使用QStyledItemDelegate,因为它提供了更强大和灵活的自定义能力,并且能更好地与Qt的样式系统集成。

4. 委托类的使用
  1. 创建Delegate类
    继承自QStyledItemDelegate(或QItemDelegate),然后重写paintcreateEditor(如果需要编辑)以及setEditorDatasetModelData等函数。

  2. 设置Delegate到View
    使用QAbstractItemView(如QTableViewQListView)的setItemDelegatesetItemDelegateForColumn/setItemDelegateForRow方法来将你的Delegate应用到整个视图或特定的列/行上。

三、简单的实例

在qt设计三个视图控件(ListView、TableView、TreeView)来显示本地系统文件结构,当本地系统文件发生改变,视图也随之改变

UI界面:

代码:

#include "widget.h"
#include "ui_widget.h"

#include <QFileSystemModel>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QFileSystemModel *model = new QFileSystemModel(this);
    model->setRootPath(QDir::currentPath());

    ui->listView->setModel(model);
    ui->listView->setRootIndex(model->index(QDir::currentPath()));

    ui->treeView->setModel(model);
    ui->treeView->setRootIndex(model->index(QDir::currentPath()));

    ui->tableView->setModel(model);
    ui->tableView->setRootIndex(model->index(QDir::currentPath()));

}

Widget::~Widget()
{
    delete ui;
}

运行结果:

当在系统中添加一个测试文件test.txt视图也随之改变:

四、结论

Qt中的MVC架构通过将应用程序分成模型、视图和控制器三个组件,实现了高内聚、低耦合的设计。这种架构使得Qt应用程序更加模块化、灵活和易于维护。通过合理地使用MVC模式,开发者可以更好地组织和管理Qt应用程序的代码,提高开发效率和应用程序的质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1963489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么建议使用 for…of 循环而不是 foreach 循环呢

在 JavaScript 和 TypeScript 的世界里&#xff0c;遍历数组是一项常见任务。许多开发者因为 .forEach 的简单和熟悉而习惯使用它。 然而&#xff0c;有一个更强大且更灵活的替代方案&#xff1a;for…of 循环。&#x1f52e; 本文将深入探讨为什么你应该考虑切换到 for…of 以…

JAVA文档注释

文档注释&#xff0c;它以 /** 开始&#xff0c;以 */ 结束。 你可以使用 javadoc 工具软件来生成信息&#xff0c;并输出到 HTML 文件中。 文档注释&#xff0c;使你更加方便的记录你的程序信息。 javadoc标签 在开始的 /** 之后&#xff0c;第一行或几行是关于类、变量和方…

全渠道AI数字化商品管理 零售品牌增长“超级引擎”

随着“流量红利”时代的终结 品牌面临增速放缓、利润下滑的双重挑战。 消费者的诉求日益理性和个性化&#xff0c; 国内外品牌角逐市场份额 A1、大数据等先进技术迅猛发展 品牌商品计划管理变得更加复杂而多维。 零售品牌正加速数字化与全渠道融合以应对挑战。 可持续盈利…

深度技术Win10系统免费下载,正式版/精简版任选!

深度技术Win10系统是非常受欢迎的操作系统版本之一&#xff0c;拥有丰富的系统功能&#xff0c;无论是日常办公、学习娱乐还是专业设计&#xff0c;它都能轻松应对。但是&#xff0c;许多新手用户不知道在哪里可以下载到深度技术Win10版本系统&#xff1f;接下来系统之家小编给…

大数据信用报告信用等级怎么看?

在大数据技术的加持之下&#xff0c;金融风控也逐渐运用大数据技术了&#xff0c;也就是我们说的大数据或者大数据信用&#xff0c;在大数据信用报告中对个人的综合信用风险有着等级划分&#xff0c;那大数据信用报告信用等级怎么看呢?本文为你详细介绍一下&#xff0c;感兴趣…

如何用nginx反代一个https的网站

最近笔者发现原本设置的一个反代无法使用了&#xff0c;查看后发现是后端服务器升级导致&#xff0c;现在必须使用https来访问&#xff0c;故而需要更改对应的nginx配置&#xff0c;趁此机会水一篇文章 一、【问题描述】 如何用nginx反代一个https的网站 二、【知识补充】 …

A Survey of Non-Volatile Main Memory File Systems——论文泛读

JCST 2023 Paper 分布式元数据论文阅读笔记整理 问题 非易失性存储器&#xff08;NVM&#xff09;提供比块设备更低的延迟和更高的带宽&#xff0c;支持字节可寻址&#xff0c;并提供可用作内存级存储设备&#xff08;非易失性主存储器&#xff0c;NVMM&#xff09;的持久性。…

7.31IO进程线程

IO思维导图 标准IO 文件IO

idea自定义模版、快捷键

原文地址&#xff1a;【IDEA】常用插件、设置、注释_idea注释插件-CSDN博客 创建模版组&#xff1a;MyTemplates 创建模版&#xff1a;forThread&#xff1a;循环打印出10个线程 第四步 for (int i 1; i < 10; i) {new Thread(() -> {$END$}, String.valueOf(i)).star…

实验2-5-6 求幂之和

#include<stdio.h> #include<math.h>int main() {int n 0;scanf("%d",&n);int sum 0;for (int i 1; i<n; i){sumsumpow(2,i);}printf("result %d",sum); }

SC,LC,FC光纤连接器接头

前言&#xff1a; &#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留…

【CPP】优先级队列

目录 1.什么是优先级队列&#xff1f;&#xff1f;&#xff1f;2.优先级队列的基本使用与理解3.优先级队列的模拟实现 今天来简单分享一下写一个极简版的优先级队列。 1.什么是优先级队列&#xff1f;&#xff1f;&#xff1f; 优先级队列属于STL中队列的一种&#xff0c;虽然…

vi编辑器的使用

vi 编辑器 vi是Linux中最基本的编辑器。但vi编辑器在系统管理、服务器配置工作中永远都是无可替代的。 一、vi的三种模式及模式切换命令 1、命令行模式 用户在用vi编辑文件时&#xff0c;最初进入的为该模式。可以进行复制、粘贴等操作。 2、插入模式 进行文件编辑&#xf…

【计算机情绪分析】十大数据集合集!宝藏合集,速看!

本文将为您介绍10个经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 1 AWARE 发布方&#xff1a; Imam Abdulrahman Bin Faisal University法赫德国王石油与矿产大学 发布时间&#xff1a; 2021-09-26 简介&#xff1a; AWARE 数据集的同行评审论文发…

Maven实战.插件

文章目录 插件目标插件绑定内置绑定自定义绑定 插件配置命令行插件配置POM中插件全局配置POM中插件任务配置 插件目标 在进一步详述插件和生命周期的绑定关系之前&#xff0c;必须先了解插件目标&#xff08;PluginCoal&#xff09;的概念。我们知道&#xff0c;Maven 的核心仅…

外星人入侵_计分

外星人入侵_计分 1添加Play按钮1.1创建Button类1.2在屏幕上绘制按钮1.3开始游戏1.4 重置游戏1.5 将Play按钮切换到非活动状态1.6隐藏光标 2提高等级2.1修改速度设置2.2重置速度 3计分3.1显示得分3.2创建记分牌3.3在外星人被消灭时更新得分3.4将消灭的每个外星人的点数都计入得分…

Linux:shell命令

Linux&#xff1a;shell命令 Shell echo命令 显示普通字符串 echo "i am wsf"显示转义字符 echo "i\" am usf"显示变量 read name#相当于python中的input echo "${name} is a name"read -p "请输入您的名字&#xff1a;" names#提…

怎么用U盘重装系统

在使用电脑的过程中&#xff0c;难免会遇到系统故障、运行缓慢等问题。当这些问题严重影响使用电脑的体验时&#xff0c;重装系统往往是一个有效的解决办法。用U盘重装系统是一种简单快捷的方法&#xff0c;本文将详细介绍如何使用U盘来重装系统&#xff0c;帮助大家轻松完成这…

推荐|代码签名证书怎么选?EV还是OV?

代码签名证书支持给.exe&#xff0c;.cab&#xff0c;.dll&#xff0c;.ocx&#xff0c;.msi&#xff0c;.xpi&#xff0c;.xap 等软件、控件进行数字签名!在选择代码签名证书时&#xff0c;EV和OV是两种常见的选择。这两种证书都用于对软件或应用程序进行数字签名。应该如何选…