我有一个树状的多态数据结构,其中节点是 Node 类(由我实现)或其任何子类的实例。我的应用程序大量使用 Boost,节点实际上由 boost::shared_ptr 类型表示,而不是 Node*
。
现在,我想创建一个 Qt 模型来包装我的树数据结构。因此,我需要一种方法将任何模型索引与内部数据结构中的节点相关联。问题来了:
Qt 支持两种方法:
第一:
QModelIndex QAbstractItemModel::createIndex (int row, int column, void * ptr = 0) const
Creates a model index for the given row and column with the internal pointer ptr.
第二个:
QModelIndex QAbstractItemModel::createIndex (int row, int columns, quint32 id) const
Creates a model index for the given row and column with the internal identifier, id.
好的,我应该如何准确地关联我的案例中的节点?不可能将shared_ptr与模型索引关联起来...是的,我知道,我可以从shared_ptr接收原始指针并将其提供给CreateIndex()
,但它闻起来很糟糕 - 似乎对我来说太不安全了。
有什么想法吗?
顺便说一句,我觉得总的来说,Boost/Qt 集成至少在内存管理领域似乎并不是微不足道的。
10 倍很多。
最佳答案
如果您想在不传递原始指针的情况下进行简单关联,请将共享内存放入容器中,并将该容器元素的 ID 值传递到模型索引中。例如,您可以创建声明
QMap< quint32, boost::shared_ptr< Foo > > index_map;
并使用它。也许您必须小心,不要重复现有指针的 ID。对我来说似乎有点过于复杂......
您也可以只保留一个指针列表(以确保在需要时持续可用),然后在 QModelIndex
中使用指针的实际地址。这可能就是我会做的。
关于qt - 将 Qt 模型绑定(bind)到现有数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2248102/