2013-02-20 120 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