【问题标题】:Qt tree model with items with multiple parents具有多个父项的 Qt 树模型
【发布时间】:2012-12-16 21:02:21
【问题描述】:

我想构建一棵树,其中一个元素可以引用另一个元素。我要建立的树是 像这样:

A
|--- B
|--- C
|    |--- D
|    |--- E
|
|--- F
     |--- P    //this is a "pointer" to C
          |--- D   //first child of C
          |--- E   //second child of C

我找到了关于我的问题的thisthis,但是在那里没有找到解决方案。

问题是在我的QAbstractItemModel 中实现 parent()。复制元素是不可能的,它可能是一个巨大的子树(我也希望它们在改变时保持同步)。

一个项目在模型中可以有多个父级(真正的父级,以及当前指向它的项目),我如何确定当前正确的父级? 目前我只有一个Item* 存储在QModelIndex 中,但是当Item* 当前为D 时,我无法确定索引是否意味着元素D 低于C 或低于P

我希望有一些方法可以解决 Qt 项目模型中的一对 N 父子映射。我希望有一些方法可以做到这一点,否则我将需要实现我自己非常想避免的小部件。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    您不需要为此编写自定义小部件。

    一种解决方案是包装您的Items,这样模型中的每个条目不仅包含一个Item*,而且还包含一些跟踪其在树中位置的标记。每个节点现在都是一个单独的实体(因此您可以轻松实现parent()),但多个节点可以引用同一个Item

    【讨论】:

    • 是的,这应该可以。然而,现在的问题是内存释放。我不知道如何释放这些令牌,因为 QModelIndex 不释放 internalPointer()
    • 您可以使用共享指针而不是原始指针来保存您的项目。当引用特定Item 的最后一个节点被删除时,它也会删除该Item
    • @ar31,你的索引不应该拥有数据,它应该只引用它。您应该为数据存储使用一些内部结构。
    【解决方案2】:

    对于每个项目,您可以存储指向其父项的指针。当您将子节点添加到节点时,您可以将 this 的引用作为其构造函数的参数,您可以将项目的父节点设置为该引用。

    【讨论】:

    • 我知道,这就是我已经在做的,问题是一个项目可以有多个父项。
    • 那么它不是一棵树,你应该将父母存储在一种集合中,比如矢量类的实例。
    【解决方案3】:

    谢谢大家,我只实现了一个包含多个父项的树视图。 正如 Tom W 所说,将我的模型数据包装到 treeitem 中。

    【讨论】:

      猜你喜欢
      • 2011-01-09
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多