Как подтвердить успешное завершение QApplication

Я работаю над проектом, который использует Qt для разработки GUI. Цикл событий Qt запускается в основном потоке. Но у меня есть требование выполнить некоторые действия по очистке после выхода из QApplication.

Поэтому я использовал qApp->quit() для выхода из приложения и для подтверждения успешного выхода из QApplication, я полагаюсь на возвращаемое значение qApp->closedDown() следующим образом

if ( true == qApp->closingDown())
{
    //Successfull exit of the QApplication. Do post exit operations
}

Вопросы: а. Делает ли qApp->quit() немедленно функцию qApp->closedDown() для возврата истинного значения. б. Есть ли другой способ подтвердить успешное завершение QApplication?

1 ответ

В зависимости от того, что вы подразумеваете под "успешным выходом", наиболее простым способом является проверка возвращаемого значения exec(), Вы можете контролировать это с помощью exit(int returnCode) вместо quit() выйти из вашего приложения.

Поскольку вы хотите подождать, пока все объекты QObject будут уничтожены, один из способов сделать это легко - заключить QApplication в область видимости, что-то вроде:

int main(int argc, char *argv[]) {
    int returnCode = 127; // choose whatever sentinel value
    {
        // put all Qt stuff in this scope
        QApplication app(argc, argv);
        //...
        returnCode = app.exec();
        // if there are any raw pointer heap QObjects without parent, delete them here
    }

    if (returnCode != 0) {
        std::cerr << "Error, exit code: " << returnCode << std::endl;
    }

    // do whatever cleanup you want to do after Qt stuff has been shut down
    // or signal the other thread, or whatever

    return returnCode;
}

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

В случае, если вы не довольны этим, есть и старый добрый atexit(),

Другие вопросы по тегам