源码解析6-系统封装-MVC机制

Qt源码解析 索引

源码解析6-系统封装-MVC机制

模型/视图教程

​ 每个 UI 开发人员都应该了解 ModelView 编程,本教程的目的是为您提供一个易于理解的主题介绍。

表、列表和树小部件是 GUI 中经常使用的组件。这些小部件可以通过两种不同的方式访问其数据。传统方式涉及包含用于存储数据的内部容器的小部件。这种方法非常直观,但是,在许多重要的应用程序中,它会导致数据同步问题。第二种方法是模型/视图编程,其中小部件不维护内部数据容器。他们通过标准化接口访问外部数据,从而避免数据重复。乍一看这可能看起来很复杂,但是一旦你仔细观察,它不仅容易掌握,而且模型/视图编程的许多好处也会变得更加清晰。

在这个过程中,我们会了解到Qt提供的一些基础技术,比如:

  • 标准和模型/视图小部件之间的区别
  • 表单和模型之间的适配器
  • 开发一个简单的模型/视图应用程序
  • 预定义模型
  • 中级主题,例如:
    • 树视图-Tree views
    • 选择-Selection
    • 委托或者代表-Delegates
    • 模型测试调试-Debugging with model test

您还将了解您的新应用程序是否可以通过模型/视图编程更轻松地编写,或者经典的小部件是否也能正常工作。

本教程包含示例代码,供您编辑和集成到您的项目中。本教程的源代码位于 Qt 的examples/widgets/tutorials/modelview目录中。

一、简介

模型/视图是一种用于在处理数据集的小部件中将数据与视图分开的技术。标准小部件不是为将数据与视图分离而设计的,这就是 Qt 有两种不同类型的小部件的原因。两种类型的小部件看起来相同,但它们与数据的交互方式不同。

  • 标准小部件使用作为小部件一部分的数据。
  • 视图类对外部数据(模型)进行操作

1.1 标准小部件

​ 让我们仔细看看标准表格小部件。表格小部件是用户可以更改的数据元素的二维数组。通过读写表格部件提供的数据元素,可以将表格部件集成到程序流程中。此方法在许多应用程序中非常直观且有用,但使用标准表格小部件显示和编辑数据库表格可能会出现问题。必须协调两个数据副本:一个在小部件之外;一个在小部件内。开发人员负责同步两个版本。除此之外,表示和数据的紧密耦合使得编写单元测试变得更加困难。

1.2 模型/视图的救援或者解救–Rescue

​ 模型/视图加强以提供使用更通用架构的解决方案。模型/视图消除了标准小部件可能出现的数据一致性问题。模型/视图还可以更轻松地使用同一数据的多个视图,因为一个模型可以传递给多个视图。最重要的区别是模型/视图小部件不在表格单元格后面存储数据。事实上,它们直接根据您的数据进行操作。由于视图类不知道您的数据结构,因此您需要提供一个包装器以使您的数据符合QAbstractItemModel接口。视图使用此接口读取和写入您的数据。实现QAbstractItemModel的实例化类可以被定义为模型。一旦视图接收到指向模型的指针,它将读取并显示其内容并成为其编辑器。

1.3 模型/视图小部件概述

以下是模型/视图小部件及其相应标准小部件的概述。


QListWidget
QListView

QTableWidget
QTableView

QTreeWidget
QTreeView

QColumnView shows a tree as a hierarchy of lists

QComboBox can work as both a view class and also as a traditional widget

1.4 在窗体和模型之间使用适配器

在表单和模型之间设置适配器会派上用场。

我们可以直接从表本身编辑存储在表中的数据,但在文本字段中编辑数据要舒服得多。对于操作一个值(QLineEdit,QCheckBox …)而不是数据集的小部件,没有直接的模型/视图对应物将数据和视图分开,因此我们需要一个适配器来将表单连接到数据源。

QDataWidgetMapper是一个很好的解决方案,因为它将表单小部件映射到表格行,并且可以非常轻松地为数据库表格构建表单。

适配器的另一个示例是QCompleter。Qt 有QCompleter用于在 Qt 小部件中提供自动完成,例如QComboBox和如下所示的QLineEdit。QCompleter使用一个模型作为它的数据源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

道格拉斯范朋克

播种花生牛奶自留田

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

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

打赏作者

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

抵扣说明:

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

余额充值