【问题标题】:How does QAbstractItemModel Represent Tree?QAbstractItemModel 如何表示树?
【发布时间】:2017-06-07 07:01:43
【问题描述】:

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

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

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

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

第二,

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

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

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

【问题讨论】:

    标签: c++ qt tree qtreeview qabstractitemmodel


    【解决方案1】:

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

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

    QModelIndex,如official documentation 所述,用于定位模型中的项目。在第一个近似值中,索引应该有足够的行、列和父项来唯一地标识这种行树模型中的项目。实际上,QModelIndex 允许您做更多事情:您可以将一些 pointer 或一些 internal id 放入索引中,如果这样可以让您自己的代码更容易在您的 @ 中使用的您自己的数据结构中识别模型项987654336@ 子类。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-02
      • 2016-10-01
      • 1970-01-01
      • 2021-12-22
      • 2012-02-26
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      相关资源
      最近更新 更多