Qt - Как обрабатывать управление памятью для диалогов? - PullRequest
0 голосов
/ 10 мая 2019

Я сталкиваюсь со следующей проблемой:

  • Пользователи нажимают "Ctrl + N", которая входит в функцию MainWindow :: newAction ()
  • В MainWindow :: newAction ()создайте QDialog dlg (centralWidget ()) и вызовите dlg.exec ()
  • Когда dlg открыт, пользователи снова нажали "Ctrl + N"

В результате dlgникогда не удаляется (оно будет удалено только после удаления CentralWidget ()).

Стек вызовов выглядит примерно так:

MainWindow::newAction ()
...
MainWindow::newAction()

Мне интересно, как справиться с этим делом.Я хочу, чтобы все локальные переменные диалога из первого вызова newAction () были удалены к тому времени, когда мы снова войдем в функцию newAction ().

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Вы также можете попробовать что-то вроде этого:

void MainWindow::newAction() {

    const auto dialog = new MyDialog(centralWidget());

    // When user will close the dialog it will clear itself from memory
    connect(dialog, &QDialog::finished, [dialog]() {
        dialog->deleteLater();
    });

    dialog->exec();
}

Тем не менее, хорошим шагом было бы запретить пользователю вызывать больше QDialogs, чем один, учитывая, что это модальное диалоговое окно (возможно, было бы неплохо сохранить этот диалоговый указатель в качестве члена класса и проверить, отображается ли он уже на экране). перед вызовом exec() на нем.

1 голос
/ 10 мая 2019

Если я правильно понял вопрос, вы хотите, чтобы открылось одно диалоговое окно, и хотите удалить его до того, как поступит новый запрос?

Если это так, вы можете сделать следующее:

В MainWindow.h объявить QDialog *dlg = nullptr

В вашей функции MainWindow.cpp newAction() вы можете выполнять следующие действия:

void newAction()
{
   if(dlg != nullptr)
   {
    dlg->close();
    dlg->deleteLater();
    //or
    //dlg->destroy(); // this will immediately free memory
   }
   dlg = new QDialog(centralWidget());
   ...
   //dlg->exec(); // This will automatically make QDialog modal.
   dlg->show(); // This will not make a QDialog modal. 
}

Надеюсь, это поможет. Помните, QDialogs при отображении с exec() они автоматически ведут себя как модальное окно. show() сделает его немодальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...