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

239 阅读3分钟

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

前言:

上一篇已经介绍过常见的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的子数据项C
QModelIndex 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);

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