Qt之模型-视图编程(模型-视图编程概览)

简述

我们时常需要将存储在计算机中的数据以可视化的方式展现出来。展现方法多种多样。

可能是表格

可能是树状图
也可能是列表

具体选用那种方法,需要根据数据的特征来确定。

Qt提供的模型/视图框架就是用来处理结构化数据的获取与展示的。

模型/视图架构

模型视图控制器(MVC)是一种源自Smalltalk的设计模式,通常在构建用户界面时使用。在《Design Patterns》中,Gamma etal. 说:

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

如果将视图和控制器对象组合在一起,则结果是模型/视图架构。这仍然保持着数据的获取与数据的表示相分离。这种分离使得可以在几个不同的视图中显示相同的数据,并实现新的视图类型,而无需更改基础数据结构。为了允许灵活地处理用户输入,我们引入了代理的概念。在此框架中使用代理的好处在于,它允许自定义呈现和编辑数据项的方式。



该模型与数据源通信,为架构中的其他组件提供接口。
通信的性质取决于数据源的类型以及模型的实现方式。
视图从模型中获取模型索引;
这些是对数据项的引用。
通过为模型提供模型索引,视图可以从数据源检索数据项。
在标准视图中,代理呈现数据项。
编辑项目后,代理将直接使用模型索引与模型进行通信。

总的来说,模型/视图框架中的类可以被分为三组:模型类,视图类以及代理类。这些组件中的每一个都由抽象类定义,这些抽象类提供了公共接口,并在某些情况下提供了功能的默认实现。抽象类旨在被子类化,以提供其他组件期望的全部功能。

模型,视图和代理使用信号槽相互通信:

  • 来自模型的信号通知视图数据源的数据发生了哪些变化。
  • 来自视图的信号提供了用户与被展示的项目之间的交互信息。
  • 来自代理的信号在会将编辑器的状态通知模型与视图。

提示: 上面的内容强调了三个核心概念:模型、视图、代理。请牢记这三个概念,后面所有的内容都将围绕它们展开。

模型

所有的模型都是基于QAbstractItemModel。这个类定义了一个接口供视图和代理获取数据。数据自身不需要存储在模型中;它可能放在一个由独立的类提供的结构,一个文件,一个数据库,或者其它应用组件。

QAbstractItemModel提供了一个数据接口,该接口足够灵活,可以处理以表,列表和树的形式表示数据的视图。但是,当为列表和类似表的数据结构实现新模型时,QAbstractListModel和QAbstractTableModel类是更好的选择,因为它们提供了相关常用功能的默认实现。

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

  • QStringListModel 被用来存储简单的字符串项目列表。
  • QStandardItemModel 管理着更加复杂的树形结构,树形结构中的每一个成员可能包含着任意的数据。
  • QFileSystemModel提供有关本地系统中文件和目录的信息。
  • QSqlQueryModel,QSqlTableModel和QSqlRelationalTableModel用于使用模型/视图访问数据库。

如果这些标准的模型无法满足你的需要,你可以通过子类化QAbstractItemModel,QAbstractListModel或QAbstractTableModel来创建自定义模型。

视图

QListView用于展示列表类数据,QTableView将来自模型的数据展示在表格中,QTreeView在层次化列表中展示了模型中的数据项目。上面的类提供了针对各种视图的完整实现。这些类都是QAbstractItemView的子类。尽管这些类是现成可用的,但他们也可以被子类化以提供自定义视图。

代理

QAbstractItemDelegate是模型视图架构中代理类的抽象基类。默认的代理实现是QStyledItemDelegate,并且它也被Qt的标准视图用作默认代理。除了QStyledItemDelegate之外,QItemDelegate也可以用作默认代理。它们之间的区别在于QStyledItemDelegate使用当前样式来绘制其项目。因此,在实现自定义委托或使用Qt样式表时,建议将QStyledItemDelegate用作基类。

方便的类

从标准视图类派生出许多便利类,它们更便于使用,但缺乏灵活性。

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

这些类的灵活性不如视图类,并且不能与任意模型一起使用。除非你非常想使用这些方便的类,否则尽量采用标准的模型/视图框架。

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

总结

上面的内容中,我们首先介绍了Qt模型/视图架构的作用以及由来,接着给出了三个核心概念:模型、视图、代理,并逐一进行了粗略的介绍。应当牢牢地记住模型/视图架构是由这三个组件构成的。

引用

[1] Qt助手

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章