Как подтвердить успешное завершение 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()
,