【问题标题】:Binding a Qt model to an existing data-structure将 Qt 模型绑定到现有数据结构
【发布时间】:2011-01-15 22:15:28
【问题描述】:

我有一个树状多态数据结构,其中节点是类 Node 的实例(由我实现)或其任何子类。我的应用程序大量使用 Boost,节点实际上由 boost::shared_ptr 类型而不是 Node* 表示。

现在,我想创建一个 Qt 模型来包装我的树数据结构。因此,我需要一种将任何模型索引与内部数据结构中的节点相关联的方法。问题来了:

Qt 支持两种方式:

第一:

QModelIndex QAbstractItemModel::createIndex ( int row, int column, void * ptr = 0 ) const

为给定的模型创建一个索引 行和列与内部 指针。

第二个:

QModelIndex QAbstractItemModel::createIndex ( int row, int column, quint32 id ) const

为给定的模型创建一个索引 行和列与内部 标识符,id。

好的,在我的情况下,我应该如何准确地关联节点?不可能将 shared_ptr 与模型索引相关联...是的,我知道,我可以从 shared_ptr 接收原始指针并将其提供给 CreateIndex(),但它闻起来很糟糕 - 对我来说似乎太不安全了。

有什么想法吗?

顺便说一句,我觉得总体而言 Boost / Qt 集成似乎不是微不足道的,至少在内存管理方面。

10 倍很多。

【问题讨论】:

    标签: qt oop model-view-controller model


    【解决方案1】:

    如果您想在不传递原始指针的情况下进行简单关联,请将共享内存放入容器中,并将该容器元素的 ID 值传递到模型索引中。例如,您可以创建声明

    QMap< quint32, boost::shared_ptr< Foo > > index_map;
    

    并使用它。也许,您必须小心不要重复现有指针的 ID。这对我来说似乎有点过于复杂......

    您也可以只保留一个指针列表(以确保在需要时持续可用),然后在QModelIndex 中使用指针的实际地址。这可能是我会做的。

    【讨论】:

    • 是的,我理解你。 GUID 指针映射和内存池都可以用来解决这个特定问题。但两种解决方案似乎都有相同的问题——看起来更像是试图“破解”问题,而不是正确解决问题。如果上述提议是使用 QT 模型做事的“正确”方式,那么我会说,这是 QT 的模型/视图架构中真正的设计问题。
    • @Lev:这很可能是一个设计问题,但我认为这不是一个很容易解决的问题……您还建议如何跟踪 any人们可能想要放入树中的各种数据?此外,您可能想了解 Qt 人员所说的“NG ModelView 类,看看它们是否更适合您:qt.nokia.com/developer/learning/online/talks/developerdays2009/…
    • @Macke 看起来是这样。我做了一个简短的谷歌搜索,找不到任何当前有效的链接(除了重复的幻灯片放映,它没有我在幻灯片文本中回忆的信息)。我最好的建议是给定的类可能是 Qt5 的一部分,您可以稍后尝试搜索这些短语,看看是否有一些内容再次出现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    相关资源
    最近更新 更多