Qt Model/View概述

概述

Qt包含了一组item view类,它们使用模型/视图架构来管理数据之间的关系以及呈现给用户的方式。该体系结构引入的功能分离为开发人员提供了更大的灵活性来定制项目的表示,并提供了一个标准的模型接口,以允许广泛的数据源与现有项目视图一起使用。在本文中,我们简要介绍了模型/视图范式,概述了所涉及的概念,并描述了项目视图系统的体系结构。对架构中的每个组件都进行了解释,并给出了如何使用所提供的类的示例。

模型/视图架构

模型-视图-控制器(Model-View-Controller, MVC)是一种源自Smalltalk的设计模式,经常用于构建用户界面。在《设计模式》一书中,Gamma等人写道:

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

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

模型/视图架构

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

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

在标准视图中委托渲染数据项。当一个项目被编辑时,委托使用模型索引直接与模型通信。

一般来说,模型/视图类可以分为上面描述的三组:模型、视图和委托。每个组件都由提供公共接口的抽象类定义,在某些情况下,还提供功能的默认实现。抽象类旨在被子类化,以便提供其他组件所期望的全套功能;这也允许编写专用组件。

模型、视图和委托使用信号(signal)和槽(slot)相互通信:

  • 来自模型的信号通知视图关于数据源所持有的数据的更改。
  • 来自视图的信号提供了关于用户与正在显示的项目交互的信息。
  • 来自委托的信号在编辑过程中用于告诉模型和视图关于编辑器的状态。

模型

所有item模型都基于QAbstractItemModel类。这个类定义了一个接口,视图和委托使用该接口访问数据。数据本身并不一定要存储在模型中;它可以保存在由单独的类、文件、数据库或其他应用程序组件提供的数据结构或存储库中。

模型类一节将介绍模型的基本概念。

QAbstractItemModel提供了一个数据接口,它足够灵活,可以处理以表、列表和树的形式表示数据的视图。然而,在为列表和类似表格的数据结构实现新模型时,QAbstractListModel和QAbstractTableModel类是更好的起点,因为它们提供了通用函数的适当默认实现。这些类都可以子类化,以提供支持特定类型列表和表的模型。

在创建新模型一节中讨论了模型的子类化过程。

Qt提供了一些现成的模型来处理数据项:

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

如果这些标准模型不能满足您的需求,您可以子类化QAbstractItemModelQAbstractListModel, or QAbstractTableModel 来创建您自己的自定义模型。

视图

为不同类型的视图提供了完整的实现:QListView显示项目列表,QTableView显示表中来自模型的数据,QTreeView显示分层列表中的数据模型项。这些类都基于QAbstractItemView抽象基类。虽然这些类是现成的实现,但它们也可以子类化以提供自定义视图。

可用的视图将在视图类一节中介绍。

委托

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

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十日十行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值