Qt基础---模型/视图编程MVC

模型/视图编程

 


模型/视图编程简介

Qt包含一组项目视图类,这些项目视图类使用模型/视图架构来管理数据及其向用户呈现方式之间的关系。此体系结构引入的功能分离为开发人员提供了更大的灵活性,可以自定义项目的表示形式,并提供标准的模型界面,以允许将各种数据源与现有项目视图一起使用。在本文档中,我们对模型/视图范式进行了简要介绍,概述了所涉及的概念,并描述了项目视图系统的体系结构。解释了体系结构中的每个组件,并给出了示例,这些示例显示了如何使用所提供的类。

模型/视图架构

模型视图控制器(MVC)是一种源自Smalltalk的设计模式,通常在构建用户界面时使用。在设计模式中,Gamma等人。写:

MVC由三种对象组成。模型是应用程序对象,视图是其屏幕显示,控制器定义了用户界面对用户输入的反应方式。在MVC之前,用户界面设计往往会将这些对象整合在一起。MVC使它们解耦以增加灵活性和重用性。

如果将视图和控制器对象组合在一起,则结果是模型/视图架构。这仍然将存储数据的方式与将其呈现给用户的方式分开,但是提供了基于相同原理的更简单的框架。这种分离使得可以在几个不同的视图中显示相同的数据,并实现新的视图类型,而无需更改基础数据结构。为了灵活处理用户输入,我们引入了委托的概念。在此框架中拥有委托的好处在于,它允许自定义呈现和编辑数据项的方式。

模型/视图架构

该模型与数据源通信,为架构中的其他组件提供接口。通信的性质取决于数据源的类型以及模型的实现方式。

视图从模型获取模型索引;这些是对数据项的引用。通过向模型提供模型索引,视图可以从数据源检索数据项。

在标准视图中,委托呈现数据项。编辑项目后,委托将使用模型索引直接与模型进行通信。

 通常,模型/视图类可以分为上述三个组:模型,视图和委托。这些组件中的每个组件都由抽象类定义,这些抽象类提供了公共接口,并在某些情况下提供了功能的默认实现。抽象类应被子类化,以提供其他组件期望的全部功能;这也允许编写专门的组件。

模型,视图和委托使用信号和插槽相互通信:

  • 来自模型的信号通知视图有关数据源保存的数据的更改。
  • 来自视图的信号提供有关用户与正在显示的项目的交互的信息。
  • 在编辑期间,将使用来自委托的信号来告知模型和有关编辑器状态的视图。

Models(模型)

所有项目模型都基于QAbstractItemModel类。此类定义了一个接口,供视图和委托用来访问数据。数据本身不必存储在模型中。它可以保存在由单独的类,文件,数据库或某些其他应用程序组件提供的数据结构或存储库中。

QAbstractItemModel提供了一个数据接口,该接口足够灵活,可以处理以表,列表和树的形式表示数据的视图。但是,当为列表和类似表的数据结构实现新模型时,QAbstractListModelQAbstractTableModel类是更好的起点,因为它们提供了常用功能的适当默认实现。这些类中的每一个都可以被子类化以提供支持特殊类型的列表和表的模型。

Qt提供了一些现成的模型,可用于处理数据项:

  • QStringListModel用于存储QString项目的简单列表。
  • QStandardItemModel管理更复杂的项目树结构,每个项目可以包含任意数据。
  • QFileSystemModel提供有关本地归档系统中文件和目录的信息。
  • QSqlQueryModel,QSqlTableModel和QSqlRelationalTableModel用于使用模型/视图约定访问数据库。

如果这些标准模型不满足您的要求,则可以将QAbstractItemModelQAbstractListModelQAbstractTableModel子类化以创建您自己的自定义模型。


Views

提供了针对各种视图的完整实现:QListView显示项目列表,QTableView显示表中模型的数据,QTreeView在分层列表中显示数据的模型项。这些类均基于QAbstractItemView抽象基类。尽管这些类是现成的实现,但也可以将它们子类化以提供自定义视图。


Delegates

QAbstractItemDelegate是模型/视图框架中委托的抽象基类。默认委托实现由QStyledItemDelegate提供,并且由Qt的标准视图用作默认委托。但是,QStyledItemDelegate和QItemDelegate是绘画和为视图中的项目提供编辑器的独立替代方法。它们之间的区别在于QStyledItemDelegate使用当前样式来绘制其项目。因此,在实现自定义委托或使用Qt样式表时,建议将QStyledItemDelegate用作基类。

排序

在模型/视图架构中,有两种方法可以进行排序:选择哪种方法取决于您的基础模型。

如果您的模型是可排序的,即重新实现了QAbstractItemModel :: sort()函数,则QTableView和QTreeView都将提供一个API,该API允许您以编程方式对模型数据进行排序。另外,您可以通过将QHeaderView :: sortIndicatorChanged()信号连接到QTableView :: sortByColumn()插槽或QTreeView :: sortByColumn(),来启用交互式排序(即允许用户通过单击视图的标题对数据进行排序)。)插槽。

如果您的模型没有所需的接口,或者您要使用列表视图来呈现数据,则另一种方法是在视图中呈现数据之前,使用代理模型来转换模型的结构。有关代理模型的部分将对此进行详细介绍。


Convenience classes(便利类)

从标准视图类派生出许多便利类,以使依赖Qt基于项目的项目视图和表类的应用程序受益。它们不打算被子类化。

此类的示例包括QListWidget,QTreeWidget和QTableWidget。

这些类的灵活性不如视图类,并且不能与任意模型一起使用。我们建议您使用模型/视图方法来处理项目视图中的数据,除非您强烈需要一组基于项目的类。

如果希望在仍然使用基于项目的界面的同时利用模型/视图方法提供的功能,请考虑将视图类(例如QListView,QTableView和QTreeView)与QStandardItemModel一起使用。

#使用模型和视图
以下各节说明如何在Qt中使用模型/视图模式。每个部分都包含一个示例,然后是显示如何创建新组件的部分。

Qt包含两个模型
Qt提供的两个标准模型是QStandardItemModel和QFileSystemModel。QStandardItemModel是一个多功能模型,可用于表示列表,表和树视图所需的各种不同的数据结构。该模型还保存数据项。QFileSystemModel是用于维护有关目录内容的信息的模型。结果,它本身不保存任何数据项,而仅表示本地归档系统上的文件和目录。

QFileSystemModel提供了一个现成的模型进行试验,并且可以轻松配置为使用现有数据。使用此模型,我们可以展示如何建立一个可用于现成视图的模型,并探索如何使用模型索引来操纵数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

道格拉斯范朋克

播种花生牛奶自留田

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

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

打赏作者

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

抵扣说明:

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

余额充值