Qt父母子女关系

时间:2013-02-20 17:20:00

标签: qt qt-creator

我正在运行测试以了解Qt中的父/子关系,我对如何在Qt Creator调试器中查看这些关系提出疑问。

当我启动我的演示应用程序时,这是调试器显示的内容:

Application Starts

因为我在添加任何小部件之前调用了Qt的dumpObjectTree(),所以除了MainWindow的布局外,树是空的。这就是我的预期。

当我关闭应用程序并调用~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 个答案:

答案 0 :(得分:1)

您的困惑在于,当您调用MainWindow析构函数时,窗口只是被销毁的一部分。

特别是,在调用QObject析构函数之前,不会通过父子机制删除子窗口小部件,之后会发生这种情况,所以在调用dumpObjectTree()时,所有子窗口仍然存在。