Я запускаю тест, чтобы понять отношения родительского/дочернего в Qt, и у меня возникает вопрос, как я могу просматривать эти отношения в отладчике Qt Creator.Qt Родительские отношения ребенка
Когда я начинаю демонстрационное приложение, вот что отладчик показывает:
Потому что я называю dumpObjectTree Qt(), прежде чем добавить любые виджеты, дерево пусто, для макета MainWindow, за исключением , Это то, чего я ожидал.
Когда я закрываю приложение и вызывается деструктор ~ MainWindow, я снова вызываю dumpObjectTree(), но на этот раз все виджеты, которые я создал, отображаются в дереве. Если я вызвал dumpObjectTree() после того, как окно было уничтожено, не должно ли дерево быть пустым снова?
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();
}
Благодаря
Спасибо! Если я передаю родительский элемент конструктору виджета, например новый QComboBox (this), ссылаясь на MainWindow, лучше ли это передать (это) или фактического родителя? Например, если я создал виджет с именем * myWidget, и я добавил к нему новый QComboBox, должен ли я инициализировать его как новый ComboBox (это) или новый ComboBox (myWidgt)? – Marc
Родитель QComboBox будет изменен после его добавления в макет, поэтому на самом деле не имеет значения, какой родительский элемент вы передаете в конструкторе, если не существует возможности исключения из времени его создания и времени его добавления. – Phlucious