关闭QDialog窗口是否会删除其动态添加的UI元素?

问题描述 投票:2回答:1

我的应用程序中有一个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在头文件中定义)

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

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

c++ qt qt5 qdialog
1个回答
4
投票

在Qt:

  • QObjects被摧毁时,他们会摧毁他们的孩子。
  • 当QWidget关闭时,除非建立Qt::WA_DeleteOnClose属性,否则不会删除它。

QWidget是一个QObject,因此它也符合第一点,因此QWidget是另一个QWidget的子节点,至少有3种可能:

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

lblmsgComboBox被传递到布局的情况下,这将是已建立的QWidget的孩子们,因为我不知道.ui不能说谁是他的父母,但我可以说有亲属关系与窗口。

所以当窗口被破坏时你的孩子也会被摧毁,这些孩子会摧毁他们的孩子,所以lbl和msgComboBox将被销毁,所以你只需要setAttribute(Qt::WA_DeleteOnClose)这样当窗口是lbl,msgComboBox和相同的Orderdialog时就会被删除关闭。

© www.soinside.com 2019 - 2024. All rights reserved.