Приложение Qt зависает при выходе (после выполнения QDialog) - PullRequest
2 голосов
/ 30 ноября 2010

Я использую Qt для создания пользовательского интерфейса, и мне нужно, чтобы перед основным окном приложения отображалось диалоговое окно, чтобы пользователь мог выбрать некоторые файлы для загрузки и тому подобное.То, что у меня есть, является довольно простым основным:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    IView *view = new QtView();
    view->showView();
    int rc = a.exec();
    std::cout << "exit" << std::endl;
    return rc;
}

класс QtView является конкретной реализацией интерфейса IView.У него есть экземпляр mainwindow и экземпляр QDialog.В методе view-> showView () это то, что у меня есть:

void QtView::showView()
{
    this->_configDialog->exec();
    this->_mainAppWindow->show();
}

Работает нормально, открывается диалоговое окно, и когда пользователь нажимает кнопку ОК, возвращается exec и появляется главное окно.Проблема в том, что когда я закрываю главное окно, я получаю зомби-процесс, и приложение просто кажется зависшим, хотя все окна закрыты, и я никогда не получаю «выход», который я распечатываю в главном как раз перед возвращением основного.Я не уверен, что я делаю не так, но я получаю тот же результат, даже если я нажимаю на крестик, чтобы закрыть диалоговое окно, открывается главное окно, и как только оно закрывается, все просто висит там.

Если у кого-нибудь есть совет, это было бы круто.Спасибо.

Ответы [ 2 ]

2 голосов
/ 01 декабря 2010

Я исправил свою проблему. Я использовал принятый / отклоненный / законченный (int) сигнал от QDialog, чтобы вызвать слот показа в главном окне приложения и показать его, если диалог был принят. В любом случае спасибо за помощь.

0 голосов
/ 01 декабря 2010

Я думаю, что возможная причина такого поведения заключается в том, что в вашем диалоговом окне конфигурации может не быть установлен родительский виджет (хотя это слепое предположение, поскольку вы не процитировали соответствующую часть кода). Это связано с тем, что QApplication по умолчанию завершает работу, только когда все windows без родительского элемента закрыты. И дело в том, что диалог - это не окно, технически - он имеет тип окна Qt :: Dialog, а не Qt :: Window. Это означает, что любое закрытое диалоговое окно по-прежнему будет запрещать автоматический выход из приложения.

Решение? Либо предоставление родителя диалогу, либо включение атрибута Qt :: WA_QuitOnClose:

this->_configDialog->setAttribute(Qt::WA_QuitOnClose);
...