2013-02-20 3 views
1

Я запускаю тест, чтобы понять отношения родительского/дочернего в Qt, и у меня возникает вопрос, как я могу просматривать эти отношения в отладчике Qt Creator.Qt Родительские отношения ребенка

Когда я начинаю демонстрационное приложение, вот что отладчик показывает:

Application Starts

Потому что я называю dumpObjectTree Qt(), прежде чем добавить любые виджеты, дерево пусто, для макета MainWindow, за исключением , Это то, чего я ожидал.

Когда я закрываю приложение и вызывается деструктор ~ MainWindow, я снова вызываю dumpObjectTree(), но на этот раз все виджеты, которые я создал, отображаются в дереве. Если я вызвал dumpObjectTree() после того, как окно было уничтожено, не должно ли дерево быть пустым снова?

enter image description here

Am Я не разрушив ребенок виджеты правильно, или я неправильно понимаю информацию, отображаемую функция 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 деструктор вызывается окно только часть пути через разрушения.

В частности, дочерние виджеты не удаляются с помощью механизма parent-child до тех пор, пока не вызывается деструктор QObject, который возникает после этого, поэтому в точке, которую вы вызываете dumpObjectTree(), все дети все еще существуют.

+0

Спасибо! Если я передаю родительский элемент конструктору виджета, например новый QComboBox (this), ссылаясь на MainWindow, лучше ли это передать (это) или фактического родителя? Например, если я создал виджет с именем * myWidget, и я добавил к нему новый QComboBox, должен ли я инициализировать его как новый ComboBox (это) или новый ComboBox (myWidgt)? – Marc

+0

Родитель QComboBox будет изменен после его добавления в макет, поэтому на самом деле не имеет значения, какой родительский элемент вы передаете в конструкторе, если не существует возможности исключения из времени его создания и времени его добавления. – Phlucious

Смежные вопросы