QAbstractItemModel如何表示树



我仍然很难理解QAbstractItemModel对项目的表示。有两种返回QModelIndex项的方法对我来说毫无意义

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

是第一个。传递给此函数的视图是什么?我索引了要为其创建索引的特定树项?如果是,函数的意义何在?为什么不只返回索引?行和列代表什么?index实际上是一个父节点吗?函数根据父节点下的行数返回特定的索引?专栏只是一个禁止专栏吗?

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

第二,

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

这个方法似乎会返回传递的索引的直接父级。我使用的数据结构本质上是树状的,但存储在一个平面数组中,数组元素包含关于树深度的信息,因此直接父对象的父对象的深度总是比它自己的深度小1。但是在这种情况下,createIndex需要输入什么呢?内部QModelIndex行、列和internalPointer指的是什么?给定我使用的基于数组的结构,数组[0]的父级应该是什么?

我已经阅读了关于这些主题的Qt示例和文档,在理解这些类的工作原理方面似乎没有任何进展。

QAbstractItemModel被称为"抽象"是有原因的。它没有定义或强制执行任何特定的存储模型项的方式,这完全取决于您,开发人员将QAbstractItemModel子类化,并在您的子类中实现所需的接口。QAbstractItemModel所执行的是视图用来与模型通信的接口。它还强制执行了一个标准视图如何显示数据的"心理模型"。

你可以把QAbstractItemModel想象成一个出生在一棵树和一张桌子的家庭中的孩子。想象一下一棵树:你有一堆项目,每个项目都可以有自己的子项目,它们也可以有它们的子项目等等。现在想象一下一个表:你有一群项目,它们被排列成一个2D数组,可以按行和列进行索引。现在想象一下,您有一个树,其中所有的项都可以有多列,因此看起来像表中的行。因此,如果你展开某个已知有子项的树项,你会看到一个表——几个子项排列成几行,每个子项都有几列。我希望这个心理模型能够帮助理解QAbstractItemModel和看似奇怪的QModelIndex类在其他方面令人困惑的接口。

正如官方文档所述,QModelIndex用于定位模型中的项目。在第一种近似中,索引应该有一行、一列和父项,以唯一地标识行树模型中的项。事实上,QModelIndex允许你做更多的事情:你可以在索引中放入一些指针或一些内部id,如果这让你自己的代码更容易识别QAbstractItemModel子类中使用的数据结构中的模型项的话。

因此,您询问的方法大致如下:

  1. QAbstractItemModel::index获取假定模型项的行、列和父级,并返回与其对应的QModelIndex。稍后,视图可能会使用返回的QModelIndex对象来调用,例如,模型的数据方法,以获取一些实际数据来显示。您可能会问,为什么视图不按行、列和父级查询数据?理论上可以,但通过QModelIndex这样做可以让你,一个特定模型子类的开发人员,使用内部指针或内部id这样的技巧
  2. QAbstractItemModel::parent应该为在QModelIndex中传递的表示的项返回父项的QModelIndex。或者,如果该项没有父项,则仅使QModelIndex无效。您现在可能想知道,如果QAbstractItemModel::createIndex采用行、列和指针或id,而不采用父QModelIndex,那么您究竟如何创建一个QModelIndex?答案很简单:QAbstractItemModel::createIndex返回的QModelIndex包含一个到创建它的模型对象的链接;因此,当视图询问其父对象的QModelIndex时,该调用被传播到创建该QModelIndex的模型,即QAbstractItemModel::parent被调用。现在,您的模型应该使用特殊的索引或内部指针或内部id,或者使用一些疯狂的魔法来识别QModelIndex中传递的指向的项的父项

相关内容

  • 没有找到相关文章

最新更新