QMdiArea иногда удаляет виджеты при закрытии окна, а иногда нет. Такое разное поведение при добавлении одной и той же функцией QMdiArea::addSubWindow мне кажется странным и никак не следующим из документации. Да, виджет устанавливается внутренним для создаваемого QMdiSubWindow для виджета, но про удаление там ничего не говорится.
//Qt 5.12.1
#include <QApplication>
#include <QMdiArea>
#include <QMdiSubWindow>
#include <QLabel>
class MdiArea: public QMdiArea
{
public:
MdiArea(QWidget *parent=nullptr): QMdiArea(parent)
{
subWindow1=new QMdiSubWindow();
subWindow1->setWidget(new QLabel("subWindow1"));
this->addSubWindow(subWindow1);
subWindow2=new QMdiSubWindow(this);
subWindow2->setWidget(new QLabel("subWindow2"));
labelSubWindow1= new QLabel("labelSubWindow1");
this->addSubWindow(labelSubWindow1);
labelSubWindow2= new QLabel("labelSubWindow2", this);
labelSubWindow2->setAttribute(Qt::WA_DeleteOnClose, false);
this->addSubWindow(labelSubWindow2);
//посмотрим удаляются ли окна при их закрытии
connect(subWindow1, &QWidget::destroyed, this, &MdiArea::onSubWindow1Destroyed);
connect(subWindow2, &QWidget::destroyed, this, &MdiArea::onSubWindow2Destroyed);
connect(labelSubWindow1, &QWidget::destroyed, this, &MdiArea::labelSubWindow1Destroyed);
connect(labelSubWindow2, &QWidget::destroyed, this, &MdiArea::labelSubWindow2Destroyed);
}
private slots:
void onSubWindow1Destroyed()//такого случаться не должно и не случается
{
QLabel *l=new QLabel("subWindow1 is destroyed");
l->setAttribute(Qt::WA_DeleteOnClose);
l->show();
}
void onSubWindow2Destroyed()//такого случаться не должно и не случается
{
QLabel *l=new QLabel("subWindow2 is destroyed");
l->setAttribute(Qt::WA_DeleteOnClose);
l->show();
}
void labelSubWindow1Destroyed()//такого случаться не должно, но это присходит при закрытии
{
QLabel *l=new QLabel("labelSubWindow1 is destroyed");
l->setAttribute(Qt::WA_DeleteOnClose);
l->show();
}
void labelSubWindow2Destroyed()//такого случаться тем более не должно, но все-равно это присходит при закрытии
{
QLabel *l=new QLabel("labelSubWindow2 is destroyed");
l->setAttribute(Qt::WA_DeleteOnClose);
l->show();
}
private:
QMdiSubWindow *subWindow1, *subWindow2;
QLabel *labelSubWindow1, *labelSubWindow2;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MdiArea w;
w.show();
return a.exec();
}
Ожидаемым поведением было бы, что оба сообщения об уничтожении subWindow2 и labelSubWindow1 будут либо оба появляться, либо оба не появляться, но происходит иначе.