gpt4 book ai didi

c++ - QAbstractItemModel 是如何表示树的?

转载 作者:太空狗 更新时间:2023-10-29 21:35:39 29 4
gpt4 key购买 nike

我仍然很难理解 QAbstractItemModel 的项目表示。有两种方法可以返回 QModelIndex 项目,这对我来说没有任何意义。

QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex& index)

是第一个。传递给这个函数的 View 是什么?我索引特定的树项以创建索引?如果是这样,该功能的意义何在?为什么不只返回索引?行和列代表什么?索引实际上是一个父节点,函数根据该父节点下的行数返回特定索引吗?专栏在这里只是空操作吗?

当使用传递的行参数时,第 0 行是指索引/父节点本身,还是它下面的第一项?

其次,

QModelIndex QAbstractItemModel::parent(const QModelIndex& index) const

似乎此方法会返回所传递索引的直接父级。我正在使用一个本质上类似于树的数据结构,但存储在一个平面数组中,数组元素包含有关树深度的信息,因此直接父级的父级始终具有深度 1 小于其自身深度的父级。但是在这种情况下,什么被提供给 createIndex 呢?内部 QModelIndex 行、列和 internalPointer 指的是什么?考虑到我正在使用的基于数组的结构,array[0] 的父级应该是什么?

我已经通读了有关这些主题的 Qt 示例和文档,但似乎无法在理解这些类的工作原理方面取得任何进展。

最佳答案

QAbstractItemModel 被称为“抽象”是有原因的。它没有定义或强制执行任何特定的模型项存储方式,这完全取决于您,开发人员继承 QAbstractItemModel 并在您的子类中实现所需的接口(interface)。 QAbstractItemModel 执行的是 View 用来与模型通信的接口(interface)。它还有点强制执行标准 View 如何呈现数据的“心智模型”。

您可以将QAbstractItemModel 想象成一个出生在树和 table 家庭中的 child 。想象一棵树:你有一堆元素,每个元素都可以有自己的子元素,它们也可以有自己的子元素等等。现在想象一个表:你有一堆项目,它们排列成一个二维数组,可以按行和列索引。现在假设您有一棵树,其中的所有项目都可以有多个列,因此看起来像表格的行。因此,如果您展开一些已知具有子项的树项,您会看到一个表格 - 几个子项排列成几行 + 每个子项都有几列。我希望这种思维模型可以帮助理解 QAbstractItemModel 和看似奇怪的 QModelIndex 类的其他困惑接口(interface)。

QModelIndex,作为 official documentation状态,用于在模型中定位项目。在第一个近似值中,索引具有一行、一列和父项就足以在这样的行树模型中唯一标识项目。实际上 QModelIndex 允许你做更多的事情:你可以把一些 pointer或一些 internal id如果这样可以让您自己的代码更轻松地识别您自己的数据结构中的模型项,则在索引中使用 QAbstractItemModel 子类。

因此,您询问的方法大致执行以下操作:

  1. QAbstractItemModel::index获取假定模型项的行、列和 parent 并返回与其对应的 QModelIndex。稍后 View 可能会使用返回的 QModelIndex 对象来调用,例如 data您的模型的方法,以便获得一些实际数据来显示。您可能会问为什么 View 不按行、列和父级查询数据?好吧,理论上它可以,但通过 QModelIndex 允许您(特定模型子类的开发人员)使用内部指针或内部 id 等技巧。
  2. QAbstractItemModel::parent应该返回由传入的 QModelIndex 表示的项的父项的 QModelIndex。或者只是无效的 QModelIndex 如果该项目没有父项。你现在可能想知道你到底如何创建一个 QModelIndex 如果 QAbstractItemModel::createIndex 就知道它的父级?采用行、列和指针或 id 但不采用父 QModelIndex?答案很简单:QAbstractItemModel::createIndex 返回的QModelIndex 包含指向创建它的模型对象的链接;因此,当 View 询问其父级的 QModelIndex 时,该调用将传播到创建该 QModelIndex 的模型,即 QAbstractItemModel::parent 被调用。现在是您的模型,它应该使用特殊索引或内部指针或内部 id 或者可能是一些疯狂的魔法来识别传入的 QModelIndex 所指向的项目的父项。

关于c++ - QAbstractItemModel 是如何表示树的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41794999/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com