LINUX.ORG.RU

Это баг или такая фича в QMdiArea?

 ,


0

1

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 будут либо оба появляться, либо оба не появляться, но происходит иначе.

Что-то ты документацию не так понял. Там сказано, что если ты создаёшь свой СабВиндов (наследуешься от класса QMdiSubWindow), тебе надо выставлять флаг ДелитОнКлоуз, а то он не удалится (как это делает обычный виджет, что и показывает твой пример).

См. реализацию.

fluorite ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.