2012-10-01 64 views
2

我想構建一棵樹,其中一個元素可以引用另一個元素。樹我想打造的是 這樣的:具有多個父項的Qt樹模型

A 
|--- B 
|--- C 
| |--- D 
| |--- E 
| 
|--- F 
    |--- P //this is a "pointer" to C 
      |--- D //first child of C 
      |--- E //second child of C 

我發現thisthis關於我的問題,但是沒有解決發現那裏。

問題是在我的QAbstractItemModel中實現parent()。複製元素是不可能的,它可能是一個巨大的子樹(我也希望它們在更改時同步)。

一個項目可以在模型中有多個父項(真正的父項以及當前指向它的項),我如何確定當前正確的父項? 目前我只是存儲在QModelIndexItem*,但是當Item*目前D我無法找到索引是否意味着元素D低於C或低於P

我希望有一種方法可以解決這個問題,以便在Qt項目模型中進行父子映射。我希望有一些方法可以做到這一點,否則我將需要實現我自己非常想避免的自己的小部件。

回答

1

您不需要爲此編寫自定義小部件。

一個解決方案是包裝你的Items,這樣你的模型中的每個條目不僅包含一個Item*,而且還包含一些記錄它在樹中的位置的記錄。每個節點現在都是獨立的實體(因此您可以輕鬆實現parent()),但多個節點可以指向相同的Item

+0

是的,這應該工作。然而現在的問題是內存釋放。我不知道如何釋放這些標記,因爲QModelIndex沒有釋放內部指針() – ar31

+0

您可以使用共享指針而不是原始指針來保存項目。當引用特定「Item」的最後一個節點被刪除時,它也會刪除該「Item」。 –

+1

@ ar31,你的索引不應該_own_數據,它應該只引用它。你應該爲_data storage_使用一些內部結構。 – Lol4t0

0

對於每個項目,您可以存儲指向其父項的指針。當你添加一個孩子到一個節點時,你可以引用this作爲它的構造函數的一個參數,你可以設置該項目的父項作爲該引用。

+0

我知道,這就是我已經在做的,問題是一個項目可以有多個父項。 – ar31

+0

然後它不是一棵樹,你應該將父母存儲在一個集合中,就像vector類的一個實例。 –

0

感謝大家,我只是實現了一個項目與多個父母的樹視圖。正如Tom W所說的那樣,將我的模型數據包裝到treeitem中。

相關問題