关闭 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 将是建立布局的小部件。
在 lbl
和 msgComboBox
被传递到布局的情况下,这将是已建立的 QWidget
的 children,因为我没有知道.ui不能说谁是他的parent但是我可以说和window.
有亲缘关系
所以当window被销毁时你的children也会被销毁,而这些children会销毁它们的children,所以lbl和msgComboBox也会被销毁,所以你只需要 setAttribute(Qt::WA_DeleteOnClose)
以便在 window 关闭时删除 lbl、msgComboBox 和相同的 Orderdialog。
我的应用程序中有一个 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 将是建立布局的小部件。
在 lbl
和 msgComboBox
被传递到布局的情况下,这将是已建立的 QWidget
的 children,因为我没有知道.ui不能说谁是他的parent但是我可以说和window.
所以当window被销毁时你的children也会被销毁,而这些children会销毁它们的children,所以lbl和msgComboBox也会被销毁,所以你只需要 setAttribute(Qt::WA_DeleteOnClose)
以便在 window 关闭时删除 lbl、msgComboBox 和相同的 Orderdialog。