1

Qt で親子関係を理解するためのテストを実行していますが、Qt Creator Debugger でこれらの関係を表示する方法について質問があります。

デモ アプリケーションを起動すると、デバッガーに次のように表示されます。

申し込み開始

ウィジェットを追加する前に Qt の dumpObjectTree() を呼び出すため、MainWindow のレイアウトを除いて、ツリーは空です。それが私が期待したことです。

アプリケーションを閉じて ~MainWindow デストラクタが呼び出されると、もう一度 dumpObjectTree() を呼び出しますが、今回は、作成したすべてのウィジェットがツリーに表示されます。ウィンドウが破棄された後に dumpObjectTree() を呼び出した場合、ツリーは再び空になるべきではありませんか?

ここに画像の説明を入力

子ウィジェットを正しく破棄していませんか、それとも 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();

}

ありがとう

4

1 に答える 1

1

あなたの混乱は、MainWindowデストラクタが呼び出されたときに、ウィンドウが破棄される途中に過ぎないことです。

特に、子ウィジェットは、その後発生するデストラクタが呼び出されるまで、親子メカニズムを通じて削除されないため、QObjectdumpObjectTree() を呼び出した時点では、すべての子がまだ存在しています。

于 2013-02-20T17:41:53.540 に答える