2014-11-08 350 views
4

我一直在閱讀Qwidgets的所有權並刪除它們。 如:http://qt-project.org/doc/qt-4.8/objecttrees.htmlQt; QWidget刪除和刪除。 setParent(NULL)是否必要?

這是說「你也可以刪除子對象自己,他們會從他們的父母自行拆除」

但是很多我所看到的設置父爲NULL刪除之前的例子。 如:

if (widget != NULL) 
{ 
    layout->removeWidget(widget); 
    widget->setParent(NULL); 
    delete widget; 
} 

是否有任何需要的setParent(NULL);

從這個領先的,是沒有任何理由,爲什麼我不能只是做一個

delete layout->itemAt(i); 

delete layout->takeAt(i); 

其實,有沒有這最後兩者之間有什麼真正的區別? 我假設我所有的物體都堆在堆上。

回答

5

在刪除它之前,絕對不需要將小部件的父項設置爲NULL。刪除後,子窗口小部件將自動從其父節點註銷。

關於第二個問題,itemAttakeAt之間真正的區別在於itemAt返回指定版面項目,takeAt回報它過於但additionaly從佈局中刪除。

使用takeAt更改佈局項目數,因爲它從佈局中移除了返回的項目。所以,要小心,不要使用它像for (int i = 0; i != layout->count(); ++i)一個循環,因爲你與我比當前更大layout->count()結束了......

注意,這樣做delete layout->itemAt(i);不會自動從佈局中刪除已刪除的項目,所以這必須避免。

+0

非常好,這證實了我的想法。 我會避免刪除layout-> itemAt(i)如果它不能被測試信任。謝謝! – Toby 2014-11-08 13:19:11