Qt | 关于Qt的模型/视图架构

478 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

前言:

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作为基类。
  • 不过,除非自定义委托需要自己进行绘制,否则,二者的代码其实是一样的。

举例:

创建文件系统模型:

//创建文件系统模型
QFileSystemModel model;
//指定目录
model.setRootPath(QDir:currentPath);

1. 用树型视图展示目录内容

//创建树型视图
QTreeView tree;
//为视图指定模型
tree.setModel(&model);
//指定根索引
tree.setRootIndex(model.index(QDir:currentPath()));
//显示树型视图
tree.show();

QFileSystemModel类提供了一个保持文件系统信息的模型,它代表了本地文件系统中的文件和目录。

2. 用列表视图展示目录内容

//创建列表视图
QListView list;
//为视图指定模型
list.setModel(&model);
指定根索引
list.setRootIndex(model.index(QDir:currentPath()));
//显示列表视图
list.show();