写点什么

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

作者:YOLO.
  • 2022 年 9 月 07 日
    河北
  • 本文字数:1224 字

    阅读完需:约 4 分钟

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 作为基类。

  • 不过,除非自定义委托需要自己进行绘制,否则,二者的代码其实是一样的。

举例:

创建文件系统模型:

//创建文件系统模型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();
复制代码


发布于: 刚刚阅读数: 3
用户头像

YOLO.

关注

还未添加个人签名 2022.05.06 加入

还未添加个人简介

评论

发布
暂无评论
Qt | 关于Qt的模型/视图架构_qt_YOLO._InfoQ写作社区