Закройте QApplication перед выполнением нового цикла обработки событий. - PullRequest
0 голосов
/ 01 февраля 2019

Я создал функцию для отображения диалога в консольном приложении Qt.Функция находится в отдельном классе с именем aClass.Вот что у меня есть:

aClass.h:

#include <QObject>
class aClass : public QObject
{
    Q_OBJECT
public:
    void showDialog(int delay);
signals:
    void quitQApplication();
};

aClass.cpp:

void aClass::showDialog (int delay)
{
    QDialog splash;
    QEventLoop eventDialog;
    splash.show();
    QTimer::singleShot(delay, &eventDialog, &QEventLoop::quit);
    eventDialog.exec();
}

Мой код намного сложнее, чем этот, и включает в себя множество потоков.Однако упрощенная версия проблемы состоит в том, чтобы показать диалоговое окно, дождаться его исчезновения и затем выйти из приложения.Ниже приведено то, что у меня есть в main.cpp:

main.cpp:

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    aClass _aClass;
    QObject::connect(&_aClass, &aClass::quitQApplication, &app, &QApplication::quit, Qt::QueuedConnection);
    _aClass.showDialog(2000);
    emit _aClass.quitQApplication();
    return app.exec();
}

Приведенный выше код работает.Однако проблема заключается в том, что иногда emit _aClass.quitQApplication(); происходит до _aClass.showDialog(2000);, то есть:

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    aClass _aClass;
    QObject::connect(&_aClass, &aClass::quitQApplication, &app, &QApplication::quit, Qt::QueuedConnection);
    emit _aClass.quitQApplication();
    _aClass.showDialog(2000);
    return app.exec();
}

В таком случае (код выше) диалоговое окно отображается, но сразу исчезает.Кроме того, приложение не завершает работу и, похоже, имеет активный цикл обработки событий.Может кто-нибудь объяснить, что здесь происходит и как я могу убедиться, что

  1. отображается диалоговое окно для определенного интервала, затем
  2. оно исчезает, а затем
  3. Приложение заканчивается

независимо от порядка выполнения emit _aClass.quitQApplication(); и _aClass.showDialog(2000);?

Заранее спасибо.

Я использую Qt 5.12.

...