Как вызвать функцию с диалоговым окном из сторонней dll внутри Qt слота

К моей программе на Qt статически подключена сторонняя dll. В dll есть метод, который содержит диалоговое окно. Этот метод вызывается в слоте:

void reportForm::showDialog_Slot()
{
    // Вызываем метод из dll с диалоговым окном
    showExtDialog(); 
}

Диалоговое окно открывается, но через несколько секунд всё само закрывается вместе с моим приложением.

Я знаю, что вызывать диалоговое окно нужно обязательно методом exec(), иначе диалог сразу закроется, поскольку слот отработает, а диалог в данном случае создан на стеке метода и по завершению метода диалог уничтожится. Но как быть, если диалоговое окно вызывается в функции из dll?


Ответы (1 шт):

Автор решения: Rikitikitavi

Вызывать диалоговое окно методом exec() совсем не обязательно. Этот метод только делает модальным окно, блокирует действия пользователя пока он не закроет окно, а также блокирует дальнейшее выполнение кода.

В документации к exec(), есть замечание использовать другую функцию : open(), которая делает тоже самое что и exec() но является асинхронной.

В вашем случае, как я понимаю, нужно обязательно выйти из функции showExtDialog(), поэтому попробуйте сделайте так:

 //где-то в dll
 void showExtDialog(QObject* parent)
 {
      QDialog* dialog = new Dialog(parent);
      dialog->open();
 }

 void reportForm::showDialog_Slot()
 {
      // Вызываем метод из dll с диалоговым окном
      showExtDialog(this); 
 }

Утечек не будет, потому-что вы передали parent, и при уничтожении reportForm уничтожится и созданное диалоговое окно. Однако здесь есть минус: нужно гарантировать что сначала вызовется деструкор reportForm а потом выгрузится библиотека.

Или можно изменить showExtDialog так чтобы он возвращал указатель на созданный диалог, и вызывающий код сам управлял бы временем жизни объекта.

→ Ссылка