2012-05-02 32 views
10

根據QGraphicsItem destructor documentation,「在銷燬項目之前將項目從QGraphicsScene中移除效率更高。」爲什麼在銷燬QGraphicsItem之前從它的場景中刪除QGraphicsItem更有效?

這是爲什麼?我想不出它是如何產生影響的。如果它確實有所作爲,應該不是的QGraphicsItem析構函數只要致電:

if (scene() != NULL) 
    scene()->removeItem(this); 

我查源,這似乎並沒有這樣的情況,雖然有時我有一個艱難的時間瞭解Qt的來源。 編輯:請參閱jdi的回答。

回答

6

也許我的理解不同的文檔比你(我還沒看着源):

的QGraphicsItem ::〜的QGraphicsItem()[虛]
銷燬的QGraphicsItem 及其所有子。如果此項目目前與 場景相關聯,則該項目在被刪除之前將從場景中移除。
注:這是更有效摧毀該項目之前從QGraphicsScene 刪除該項目。

我認爲這意味着它將從場景中刪除它首先摧毀因爲這樣效率更高了。但是如果你說源代碼並沒有指出發生這種情況的任何地方,那麼看起來文檔是錯誤的?

如果我不得不猜測爲什麼在銷燬它之前先刪除該項目會更有效率(不管API是否真的在析構函數中爲你做這件事情),我認爲它將不得不做什麼觸發現場重新索引。也許通過刪除仍在場景中的項目,子項目的級聯刪除會不斷觸發場景重新索引。然而,如果您要先刪除該項目,則可以以僅需要對場景進行單一更新的方式高效地提取整個層次結構,然後可以在不進一步影響的情況下進行正常刪除?其他兒童事件/信號甚至可能會在場景中被刪除時產生更多級聯效應。

我打賭後面的「注」的邏輯是告訴那些誰也子類的QGraphicsItem和重載析構函數要記住需要從現場先刪除。

+1

謝謝你。我再次檢查了源,並且實際上有一行檢查場景是否存在,如果是,則調用'd_ptr-> scene-> d_func() - > removeItemHelper(this);'。我想那一定是吧。所以看起來你是對的,說明可能有點誤導(無論是或者我是一個doofus)。 – Anthony

+0

@Anthony:我打算帶着誤導:-)。文檔是有用的,如果它讓你感到困惑,那麼它是一個有效的觀察。做好通過源頭檢查確認。 – jdi

相關問題