2010-02-11 146 views
3

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

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

Qt支持这样做的方法有两种:

第一:

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

为给定的 行和列与内部 模型指数指针ptr。

其次:

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

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

好吧,在我的情况下应该如何关联节点?有没有可能将shared_ptr与模型索引关联...是的,我知道,我可以从我的shared_ptr接收一个原始指针并将其提供给CreateIndex(),但它味道不好 - 对我来说似乎太不安全。

任何想法?

顺便说一下,我觉得一般来说Boost/Qt的整合似乎不是微不足道的,至少在内存管理方面。

10倍很多。

回答

2

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

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

并使用它。也许你必须小心不要重复现有指针的ID。这对我来说似乎有些过于复杂......你也可以只保留一个指针列表(以确保在需要时持续可用),然后在QModelIndex中使用指针的实际地址。这可能是我会做的。

+0

是的,我理解你。 GUID指针映射和内存池都可以用来解决这个特定的问题。但这两种解决方案似乎都有同样的问题 - 看起来更像是试图“破解”问题,而不是妥善解决问题。 如果上述提议是用QT模型做事的“正确”方式,那么我会说,这是QT模型/视图体系结构中真正的设计问题。 – Lev 2010-02-12 19:13:28

+0

@Lev:这可能是一个设计问题,但不是我认为会很容易解决的问题......你会建议如何跟踪人们可能想要放入树中的任何类型的数据?此外,您可能想要了解Qt人们称之为“NG模型视图”课程,并查看它们是否对您有所帮助:http://qt.nokia.com/developer/learning/online/talks/developerdays2009/ tech-talks/the-next-generation-qt-item-views – 2010-02-13 15:28:21

+0

@cjhuitt:链接中断 – Macke 2012-11-19 08:08:04

相关问题