概述
简述
我们时常需要将存储在计算机中的数据以可视化的方式展现出来。展现方法多种多样。
可能是表格
具体选用那种方法,需要根据数据的特征来确定。
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助手
最后
以上就是平淡麦片为你收集整理的Qt之模型-视图编程(模型-视图编程概览)简述模型/视图架构模型视图代理方便的类总结引用的全部内容,希望文章能够帮你解决Qt之模型-视图编程(模型-视图编程概览)简述模型/视图架构模型视图代理方便的类总结引用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复