Удаляет ли закрытие окна QDialog его динамически добавленные элементы пользовательского интерфейса? - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть окно QDialog в моем приложении, и я динамически добавляю QComboBox для его макета с помощью этого кода

Orderdialog.cpp

void Orderdialog::addElements()
{
    ui->setupUi(this);
    msgComboBox = new QComboBox();
    lbl = new QLabel();
    lbl->setText("Message");
    ui->formLayout->addRow(lbl,msgComboBox);    
}

(msgComboBox & lbl определяется в заголовочном файле)

Согласно этот вопрос установка attritubte удалит объект диалога, когда его событие close () выполнено.

Я хочу знать, удаляет ли он эти динамически добавленные msgComboBox & lbl или мне нужно вручную удалить их в деструкторе класса Orderdialog?

1 Ответ

0 голосов
/ 12 сентября 2018

В Qt:

  • Когда QObject уничтожены, они уничтожают своих детей.
  • Когда QWidget закрыт, он не удаляется, кроме случаев, когда установлен атрибут Qt::WA_DeleteOnClose.

QWidget - это QObject, поэтому он также соответствует первому пункту, так что QWidget является потомком другого QWidget, есть как минимум 3 возможности:

  • Вы передаете родительский QWidget в конструктор.
  • Вы используете метод setParent().
  • И когда вы устанавливаете его с помощью макета, поскольку ваш родитель будет виджетом, для которого был создан макет.

В случае передачи lbl и msgComboBox в макет, это будут потомки установленного QWidget, так как я не знаю .ui не мог сказать, кто его родитель, но я Можно сказать, что есть связь родства с окном.

Таким образом, когда окно будет уничтожено, ваши дети также будут уничтожены, и эти дети уничтожат своих детей, поэтому lbl и msgComboBox будут уничтожены, поэтому вам нужно только setAttribute(Qt::WA_DeleteOnClose), чтобы lbl, msgComboBox и тот же Orderdialog были удаляется при закрытии окна.

...