2012-07-22 75 views
2

我一直在閱讀Qt文檔和玩qobject樹。我想知道是否有方法從樹內刪除將從內存中刪除它們的小部件。當對象中嵌入qwidgets/qobjects並創建樹時,從qlayouts中刪除一個帶有removeWidget的小部件將在gui中直觀地刪除它們,但是該對象仍然附着在父qobject上(object-> parent()是不是0),只有刪除其父項時纔會被刪除(例如超出範圍)。我只能看到,只有當應用程序終止時,qwidget纔會被銷燬,頂層小部件會將其下的所有東西(或者如果對象超出範圍)放置在其中。Qt:RemoveWidget和對象刪除

例如,假設有一個主窗口有兩個階段:第一個窗口從一個父窗口嵌入大約100個對象,另一個窗口有200個窗口。應用程序從第1階段開始,移動到第2階段,它永遠不會去回到階段1.如果我希望這樣做有點高效,我會嘗試殺死階段1(100個對象)中的所有對象,但因爲它們連接到主窗口的根節點,所以即使使用「 removeWidget」。

我也嘗試接收沒有「new」運算符創建的小部件的指針,如果我刪除該對象,應用程序會崩潰,因爲它會調用析構函數兩次。

我的問題是,有沒有辦法刪除qobject樹中的一個節點(該節點沒有被刪除,因爲它超出了範圍或當應用程序終止)?

對不起,如果這沒有多大意義。提前致謝。

編輯:

很抱歉,如果我給了錯誤的想法。我的問題是在應用程序終止之前或對象超出範圍之前從內存中刪除一個節點。這是一個例子(可能不太好)。

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Test w; 
    w.show(); 

    QHBoxLayout *layout = new QHBoxLayout(); 
    w.setLayout(layout); 

    Test heavyObj;    //I know you can use pointers instead and that 
           //would allow you to easy delete the object 
           //but say if I did this instead. 
    w->addWidget(&heavyObj); 

    for(int i=0; i < 200; i++) { 
     Test obj(heavyObj); 
    } 

    w->removeWidget(&heavyObj); //At this point we don't want "heavyObj", I want 
           //to delete this object from memory 
           // is it possible to remove p1 from memory? 

    return a.exec(); 

    //As stated, once the program terminates everything is destroyed 
} 

回答

3

調用removeWidget()後,刪除delete yourWidgetPointer;的對象。 QObject的析構函數將負責將子項與父項一起註銷。

+0

但是你不能這樣做,如果你沒有「新」對象初始化對象?你將不得不讓它超出範圍? – user654628 2012-07-22 10:22:20

+0

是的。如果您希望更清晰地控制從堆棧中清除對象的時間,則可能需要使用scoped_ptr。另外,爲了確保對象超出範圍,通常不難定義狹窄範圍(使用大括號)。 – 2012-07-22 10:24:15

+0

有沒有辦法從qobject樹中刪除一個節點而不使用指針並調用delete,或者是否必須等待該對象超出範圍?是否有任何時候我不想將qwidget初始化爲指針? – user654628 2012-07-22 10:26:58

0

當在堆上被創建的QObject(即,與新創建的),一個樹 可以從中以任何順序構造,並且之後,在 的對象的樹可以以任何破壞訂購。當樹 中的任何QObject被刪除時,如果該對象有一個父對象,析構函數會自動從該父對象中刪除該對象。如果對象有子項,則析構函數會自動刪除每個子項。 無論銷燬順序如何,都不會刪除QObject 兩次。

摘自here

我不知道你在問什麼,如果你刪除一個對象,它將從它的父對象中刪除,然後刪除它擁有的任何子對象(並且這會從你正在刪除的子樹中級聯下來)。請顯示您致電的代碼會導致段錯誤,因爲您應該能夠在樹中的任意位置刪除(使用delete)任何QObject,並且樹會自行重組。