Qt | 关于 Qt 的模型 / 视图架构
前言:
MVC(Model-View-Controller)架构是一种经常用于创建用户界面的设计模式。通过数据和界面进行分离,可以使相同的数据在多个不同的数图中进行显示。还可以在创建新的视图时,不需要改变底层的数据架构。
模型/视图的组成部分:
大体上,模型/视图架构中的众多类可以分为 3 组:模型(Model)、视图(View)和委托(Delegate)。它们之间使用信号和槽来实现通信。
当数据源的数据发生改变时,模型发出信号告知视图;
当用户与显示的项目交互时,视图发出信号来提供交互信息;
当编辑项目时,委托发出信号,告知模型和视图编辑器的状态。
模型:
QAbstractItemModel 是模型的抽象基类,这个类定义了一个接口,可以供视图和委托来访问数据。数据不一定非要存在模型中,也可以存在一个数据结构、一个独立的类、文件、数据库或者应用程序的其他一些组件中。
QAbstractItemModel 为数据提供了一个十分灵活的接口来处理各种视图,视图可以将数据表现为表格(table)、列表(list)和树(tree)等形式。如果要实现一个基于列表或者表格的数据机构的新模型,可以使用 QAbstractItemModel 和 QAbstractTableModel 类,因为它们为一些常见的功能提供了默认的实现。
Qt 中的模型:
QStringListModel:用来储存一个简单的 QString 项目列表;
QStandardItemModel:管理复杂的树型结构数据项,每一个数据项可以包含任意的数据;
QFileSystemModel:提供了本地文件系统中文件和目录的信息;
QSqlQueryModel、QSqlTableModel 和 QSqlRelationalTableModel:用来访问数据库。
视图:
QAbstractItemView 是视图的抽象基类,可以直接使用,也可以被子类化来提供定制的视图。
Qt 中的视图:
QListView 将数据项显示为一个列表;
QTableView 将模型中的数据显示在一个表格中;
QTreeView 将模型的数据项显示在具有层次的列表中。
委托:
QAbstractItemDelegate 是委托的抽象基类。为使用方便,从 4.4 开始,Qt 提供了另外的基于组件的子类:QItemDelegate 和 QStyledItemDelegate。
默认的委托是 QStyledItemDelegate。二者的区别在于绘制和向视图提供编辑器的方式。
QStyledItemDelegate 使用当前样式绘制,并且能够使用 Qt Style Sheet,因此我们推荐在自定义委托时,使用 QStyledItemDelegate 作为基类。
不过,除非自定义委托需要自己进行绘制,否则,二者的代码其实是一样的。
举例:
创建文件系统模型:
1. 用树型视图展示目录内容
QFileSystemModel 类提供了一个保持文件系统信息的模型,它代表了本地文件系统中的文件和目录。
2. 用列表视图展示目录内容
版权声明: 本文为 InfoQ 作者【YOLO.】的原创文章。
原文链接:【http://xie.infoq.cn/article/3e3aa6c84f5da0bd6db1816aa】。未经作者许可,禁止转载。
评论