关闭 QDialog window 会删除其动态添加的 UI 元素吗?

Does closing a QDialog window delete its dynamically added UI elements?

我的应用程序中有一个 QDialog window,我正在通过这段代码为其布局动态添加一个 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定义在头文件中)

根据 this question 设置属性将在执行其 close() 事件时删除对话框对象。

我想知道的是删除这些动态添加的msgComboBox & lbl 还是需要我手动删除它们Orderdialog 的析构函数 class?

在 Qt 中:

  • QObject 被摧毁时,他们会摧毁他们的 children。
  • QWidget 关闭时不会被删除,除非 Qt::WA_DeleteOnClose 属性已建立。

一个QWidget是一个QObject所以它也符合第一点,所以一个QWidget是另一个QWidget的children至少有3种可能:

  • 您在构造函数中传递 parent QWidget。
  • 您使用setParent()方法。
  • 并且当您通过布局建立它时,因为您的 parent 将是建立布局的小部件。

lblmsgComboBox 被传递到布局的情况下,这将是已建立的 QWidget 的 children,因为我没有知道.ui不能说谁是他的parent但是我可以说和window.

有亲缘关系

所以当window被销毁时你的children也会被销毁,而这些children会销毁它们的children,所以lbl和msgComboBox也会被销毁,所以你只需要 setAttribute(Qt::WA_DeleteOnClose) 以便在 window 关闭时删除 lbl、msgComboBox 和相同的 Orderdialog。