2010-02-11 65 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

相關問題