2013-02-20 117 views
1

我正在運行一個測試來了解Qt中的父/子關係,我有一個關於如何在Qt Creator調試器中查看這些關係的問題。Qt父子關係

當我開始我的演示程序,這裏是調試器顯示:

Application Starts

因爲我把Qt的dumpObjectTree()之前,我添加任何部件,該樹是空的,除了主窗口的佈局。這就是我的預期。

當我關閉應用程序,並調用〜MainWindow析構函數時,我再次調用dumpObjectTree(),但是這次我創建的所有小部件都顯示在樹中。如果我在窗口被銷燬後調用dumpObjectTree(),樹不應該再次變空嗎?

enter image description here

我不能毀了孩子部件正確的,還是我誤解由dumpObjecTree()函數顯示的信息?

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 

    qDebug() << "WINDOW INITIALIZED-------------"; 
    dumpObjectTree(); 
    this->buildLayout(); 

} 

void MainWindow::buildLayout() { 

    QWidget *window = new QWidget(this); 
    this->setObjectName("Main Window"); 

    layout = new QVBoxLayout(); 

    QSplitter *split = new QSplitter(); 
    split->setObjectName("Horizontal Split"); 
    split->setOrientation(Qt::Horizontal); 
    QTextEdit *editor1 = new QTextEdit(); 
    editor1->setObjectName("Editor 1"); 
    QTextEdit *editor2 = new QTextEdit(); 
    editor2->setObjectName("Editor 2"); 
    split->addWidget(editor1); 
    split->addWidget(editor2); 

    QSplitter *split2 = new QSplitter(); 
    split2->setObjectName("Vertical Split"); 
    split2->setOrientation(Qt::Vertical); 
    QTextEdit *editor3 = new QTextEdit(); 
    editor3->setObjectName("Editor 3"); 
    split2->addWidget(split); 
    split2->addWidget(editor3); 

    QToolBar *mainToolbar = new QToolBar(); 
    mainToolbar->setObjectName("Main Toolbar"); 
    mainToolbar->addAction("Main Button 1"); 
    mainToolbar->addSeparator(); 
    mainToolbar->addAction("Main Button 2"); 
    mainToolbar->setMovable(true); 

    layout->addWidget(mainToolbar); 
    layout->addWidget(split2); 

    QToolBar *toolbar = new QToolBar(this); 
    toolbar->setObjectName("Mini Toolbar"); 
    toolbar->addAction("Button 1"); 
    toolbar->addSeparator(); 
    toolbar->addAction("Button 2"); 
    toolbar->setMovable(true); 

    QMenuBar *menu = new QMenuBar(this); 
    menu->setObjectName("Menu Bar"); 
    menu->addAction("Menu 1"); 
    menu->addAction("Menu 2"); 
    menu->addAction("Menu 3"); 

    window->setLayout(layout); 

    MainWindow::addToolBar(toolbar); 
    MainWindow::setMenuBar(menu); 
    MainWindow::setCentralWidget(window); 

} 

MainWindow::~MainWindow() 
{ 

    delete layout; 
    qDebug() << "DESTROYED " << this->metaObject()->className(); 
    qDebug() << "OBJECT TREE-------------"; 
    dumpObjectTree(); 
    qDebug() << "OBJECT INFO-------------"; 
    dumpObjectInfo(); 

} 

感謝

回答

1

你的困惑是,當你的MainWindow析構函數被調用時,窗口只有通過被破壞的方式的一部分。

特別是,通過父子機制不會刪除子窗口小部件,直到調用QObject析構函數爲止,因此在調用dumpObjectTree()時,所有子窗口仍然存在。

+0

謝謝!如果我將父項傳遞給窗口構件的構造函數,如新的QComboBox(this),引用MainWindow,最好傳遞(this)還是實際的父元素?例如,如果我創建了一個名爲* myWidget的小部件,並且我添加了一個新的QComboBox,我應該將它初始化爲新的ComboBox(this)還是新的ComboBox(myWidgt)? – Marc 2013-02-20 18:16:44

+0

一旦將QComboBox的父項添加到佈局中,QComboBox的父項將被更改,因此,在構造函數中傳遞哪個父項並不重要,除非在構造時間和添加時間之間有可能拋出異常。 – Phlucious 2013-02-20 18:27:56