写点什么

Qt | 深入了解 Qt 中的模型类

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

    阅读完需:约 4 分钟

Qt | 深入了解Qt中的模型类

前言:

上一篇已经介绍过常见的 3 种模型分别是列表模型、表格模型和树模型,它们分别以列表结构、表格结构和树型结构组织数据。每一个数据项是一个 item,每一个 item 有对应的行(row),表格模型的 Item 有对应的列(column)。

模型索引:

为了确保数据的表示与数据的获取相分离,Qt 引入了模型索引的概念。视图和委托可以使用索引来请求数据项并显示。模型的索引包含一个指针,指向创建它们的模型,使用多个模型时可以避免混淆。

模型索引由 QModelIndex 类提供,它是对一块数据的临时引用,可以用来检索或者修改模型中的数据。如果要获取一个数据项的模型索引,则必须指定模型的 3 个属性:行号列号父项的模型索引

获取数据项的索引:

QModelIndex index = model->index(row, column, parent);
复制代码

行和列:

  • 一个模型可以通过把它看做一个简单的表格来访问,每个数据项可以使用行号和列号来定位。

  • 行号和列号都是从 0 开始的。

例:

//获取第0行,第0列的数据项QModelIndex indexA = model->index(0, 0, QModelIndex());//获取第1行,第1列的数据项QModelIndex indexB = model->index(1, 1, QModelIndex());//获取第2行,第1列的数据项QModelIndex indexC = model->index(2, 1, QModelIndex());
复制代码

父项:

  • 列表模型和表格模型的每一个数据项都以根项(Root item)为父项的,获取数据项的索引时,“父项的模型索引”这个参数可以用 QModelIndex()来表示。

  • 树模型中,每一个数据项都可能成为其他数据项的父项,顶层数据项的父项还是 QModelIndex,行列值为当前父项中的行列值,从 0 开始。

例:

//获取树模型顶层数据项QModelIndex indexA = model->index(0, 0, QModelIndex);QModelIndex indexB = model->index(2, 0, QModelIndex);//获取数据项A的子数据项CQModelIndex indexC = model->index(1, 0, indexA);
复制代码

项角色:

模型中的数据项可以指定作为各种角色显示在各种组件中,允许为不同的情况提供不同类型的数据。

常用的角色有:

  • Qt::DisplayRole:数据被渲染为文本(数据为 QString 类型)

  • Qt::DecorationRole:数据被渲染为图标等装饰(数据为 QColor、QIcon 或者 QPixmap 类型)

  • Qt::EditRole:数据可以在编辑器中进行编辑(数据为 QString 类型)

  • Qt::ToolTipRole:数据显示在数据项的工具提示中(数据为 QString 类型)

  • Qt::StatusTipRole:数据显示在状态栏中(数据为 QString 类型)

  • Qt::WhatsThisRole:数据显示在数据项的“What's This?”模式下(数据为 QString 类型)

  • Qt::SizeHintRole:数据项的大小提示,将会应用到视图(数据为 QSize 类型)

例:

QVariant value = model->data(index, role);
复制代码

通过向模型指定相关数据项对应的模型索引以及特定的角色来获取需要的类型的数据。

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

YOLO.

关注

还未添加个人签名 2022.05.06 加入

还未添加个人简介

评论

发布
暂无评论
Qt | 深入了解Qt中的模型类_qt_YOLO._InfoQ写作社区