Как вызвать функцию с диалоговым окном из сторонней dll внутри Qt слота
К моей программе на Qt статически подключена сторонняя dll. В dll есть метод, который содержит диалоговое окно. Этот метод вызывается в слоте:
void reportForm::showDialog_Slot()
{
// Вызываем метод из dll с диалоговым окном
showExtDialog();
}
Диалоговое окно открывается, но через несколько секунд всё само закрывается вместе с моим приложением.
Я знаю, что вызывать диалоговое окно нужно обязательно методом exec(), иначе диалог сразу закроется, поскольку слот отработает, а диалог в данном случае создан на стеке метода и по завершению метода диалог уничтожится. Но как быть, если диалоговое окно вызывается в функции из dll?
Ответы (1 шт):
Вызывать диалоговое окно методом 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 так чтобы он возвращал указатель на созданный диалог, и вызывающий код сам управлял бы временем жизни объекта.