我有一个树状的多态数据结构,其中节点是Node类(由我实现)或其任何子类的实例。我的应用程序大量使用Boost,节点实际上由boost :: shared_ptr类型而不是Node*
表示。
现在,我想创建一个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倍。
答案 0 :(得分:2)
如果要在不传递原始指针的情况下进行简单关联,请将共享内存放在容器中,并将该容器元素的ID值传递给模型索引。例如,您可以创建声明
QMap< quint32, boost::shared_ptr< Foo > > index_map;
并使用它。您可能必须小心不要复制现有指针的ID。这对我来说似乎有点过于复杂......
您也可以保留一个指针列表(以确保在需要时继续可用),然后使用QModelIndex
中指针的实际地址。这可能就是我要做的。