Qt 5.12--Model/View模型/视图(MVC)模式

1 简介

1.1 《Mastering Qt 5》 [2]中MVC简介

Model:model管理数据,负责数据的请求和更新
View:向用户展示数据
Controller:处理Model和View之间的交互。负责为View提供正确的数据,为Model提供来自View的操作请求。
该模式降低耦合,多个View可以显示同一数据,View层不用担心数据层Model发生变化。

1.2 Qt中Model/View简介

Table, list and tree widgets是UI中常用的组件。窗口获取数据有2种方式。

  • 传统方式
    窗口包含小的控件,控件直接存取数据。这种方式直接但是在一些大的项目中会产生数据同步的问题。
  • 第二种方式
    便是model/view模式,该模式中,窗口不再包含含有内部数据的控件。他们通过标准化接口访问外部数据,因此避免了数据重复。 乍一看,这似乎很复杂,但是一旦仔细研究,不仅容易掌握,而且模型/视图编程的许多好处也变得更加明显。
    在这里插入图片描述

1.3 百度百科中的介绍

model/view模式也就是MVC。
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

2 设计初衷、核心思想

2.1 初衷

Model/View模式设计之初就是为了将窗体中的视觉控件和数据分离。

2.2 核心思想

3 Qt model/view介绍

3.1 标准窗体

标准的窗体,包含视觉控件,数据是视觉控件一部分。
在这里插入图片描述
用户直接通过控件读写数据,该方式在一些应用中直接、有效。但是控件内外的两个数据版本要同步,数据和表达的紧密耦合使得单元测试困难。

3.2 Model/View

视图类对外部数据(模型)进行操作。
在这里插入图片描述
Model/View模式避免了窗体中小控件操作数据出现同步问题。

3.3 Model/View窗体概述

在这里插入图片描述
在这里插入图片描述

3.4 使用Adapters在Forms和Models之间

直接从表本身内部编辑存储在表中的数据,但是在文本字段中编辑数据要舒适得多。 没有直接的模型/视图副本将数据和视图的小部件分开,该小部件对一个值(QLineEdit,QCheckBox …)而不是数据集进行操作,因此我们需要一个适配器才能将表单连接到数据源。
QDataWidgetMapper是一个很好的解决方案,因为它可以将表单小部件映射到表行,并且非常容易为数据库表构建表单。在这里插入图片描述
适配器的另一个示例是QCompleter。 Qt具有QCompleter,用于在Qt小部件(例如QComboBox)和QLineEdit中提供自动完成功能,如下所示。 QCompleter使用模型作为其数据源。
在这里插入图片描述

4 优缺点

4.1 优点

  • 降低视觉控件操作数据的耦合性
  • 避免多控件读写数据出现一致性问题

4.2 缺点

  • 小工程中增加代码量

5 模块介绍

5.1 TreeView

QListView,QTableView和QTreeView都使用模型抽象,即合并的列表,表和树。 这样就可以使用同一模型中的几种不同类型的视图类。
在这里插入图片描述
QStandardItemModel用于分层数据的容器,该容器也实现了QAbstractItemModel。 要显示树,必须用QStandardItems填充QStandardItemModel,QStandardItems可以保存项目的所有标准属性,例如文本,字体,复选框或笔刷。

扫描二维码关注公众号,回复: 10363020 查看本文章

5.2

5.3

6 示例

7 理解

在这里插入图片描述
MVC(视图/模型结构)把数据和视图组件分离,这使得我们可以在几个不同的试图组件中显示相同的数据,并且实现新类型的视图,并且不改变底层的数据结构。也可以根据控制响应的不同命令,在同一个组件区创建不同的视图样式,来加载不同的输入数据。为了更灵活的对用户输入进行处理,引入了delegate这个概念。它的好处是,数据项的渲染与编程可以进行定制。
在这里插入图片描述
view从model获取model indexes,后者是数据项的引用。通过把model indexes提供给model,view可以从数据源中获取数据。在标准的views中,delegate会对数据项进行渲染,当某个数据项被选中时,delegate通过model indexes与model直接进行交流。

Models、views、delegates之间通过信号—槽机制来进行通信:
(1).从model发出的信号通知view数据源中的数据发生了改变。
(2).从view发出的信号提供了有关被显示的数据项与用户交互的信息。
(3).从delegate发生的信号被用于在编辑时通知model和view关于当前编辑器的状态信息。

Models(模型):

    所有的item models都基于QAbstractItemModel类,这个类定义了用于views和delegates访问数据的接口。数据本身不必存储在model,数据可被置于一个数据结构或另外的类、文件、数据库、或其它的程序组件中。

   QAbstractItemModel提供给数据一个接口,它非常灵活,基本满足views的需要,无论数据用以下任何形式表现,如table、list、trees。然而,当你重新实现一个model时,如果它基于table或list形式的数据结构,最好从QAbstractListModel、QAbstractTableModel开始做起,因为它们提供了适当的常规功能的缺省实现。这些类可以被子类化以支持特殊的定制需求。
    Qt提供了一些现成的models用于处理数据项:

(1).QStringListModel 用于存储简单的QString项目列表。
(2).QStandardItemModel管理更复杂的树型结构数据项,每项都可以包含任意数据。
(3).QFileSystemModel提供本地文件系统中的文件与目录信息。
(4).QSqlQueryModel、QSqlTableModel、QSqlRelationTableModel用来访问数据库。

   如果这些标准模型不能满足需要,可以使用子类化QAbstractItemModel、QAbstractListModel、QAbstractTableModel类来定制模型。
  • Views(视图):
    不同的view都完整实现了各自的功能,QListView把数据显示为一个列表,QTableView把Model 中的数据以table的形式表现,QTreeView用具有层次结构列表来显示model中的数据。这些类都基于QAbstractItemView抽象基类。尽管这些类都已经完整地得到了实现,但它们仍然可以用于子类化以满足定制需求。
  • Delegates(委托):
    QAbstractItemDelegate是model/view架构中的用于delegate的抽象基类。缺省的delegate实现在QStyledItemDelegate类中提供,它可以用于Qt标准views的缺省 delegate。但是,QStyledItemDelegate和QItemDelegate是相互独立的用于实现视图(views)中items的描绘和编辑功能的方法。它们两者的不同在于,QStyledItemDelegate使用当前的样式(style)来描绘items。因此,当我们实现定制委托(delegate)或者使用Qt Style Sheets时,我们建议使用QStyledItemDelegate作为基类。
  • Sorting(排序):
    在model/view架构中,有两种方法进行排序,选择哪种方法依赖于你的底层Model。假如你的model是可排序的,也就是它重新实现了QAbstractItemModel::sort()函数,QTableView与QTreeView都提供了API,允许你以编程的方式对model数据进行排序。另外,你也可以进行交互方式下的排序(例如,允许用户通过点击view表头的方式对数据进行排序),具体方法是:把QHeaderView::sectionClicked()信号与QTableView::sortByColum()槽或QTreeView::sortByColumn()槽进行关联。
    另一种方法是,假如你的model没有提供需要的接口或是你想用list view表示数据,可以用一个代理model在用view表示数据之前对你的model数据结构进行转换。
  • Convenience classes(便利类):
    许多便利类都源于标准的view类,它们方便了那些使用Qt中基于项的view与table类,它们不应该被子类化,它们只是为Qt 3的等价类提供一个熟悉的接口。这些类有QListWidget、QTreeWidget、QTableWidget,它们提供了如Qt 3中的QListBox、 QlistView、QTable相似的行为。这些类比View类缺少灵活性,不能用于任意的models,推荐使用model/view的方法处理数据。

参考

1、Qt Model/View模型/视图使用总结(一)
2、Qt Model/View使用模型/视图(二)
3、深入理解模型视图、自定义模型
4、38.Qt模型/视图结构
5、深入理解MVC
6、官方–Model/View Tutorial
7、QT开发(三十八)——Model/View框架编程
8、Qt Model/View理解(一)—构造model
9、Qt官方–Model/View Programming
10、MVC框架
11、QT开发(三十七)——Model/View官方文档

发布了496 篇原创文章 · 获赞 601 · 访问量 155万+

猜你喜欢

转载自blog.csdn.net/qq_38880380/article/details/103934965
今日推荐