Очистка должна обрабатываться деструкторами и отношениями между родителями и родителями.
Сделайте свой главный объект (основной) дочерним элементом QApplication, чтобы он был разрушен всеми его дочерними элементами до QApplication.
Вы уверены, что убили все свои темы? Если нить с eventloop обязательно позвоните QThread::quit()
, чтобы выйти из eventloop перед вызовом QThread::wait()
Вы также можете использовать вакуум QApplication::qAddPostRoutine (QtCleanUpFunction ptr)
сделать некоторые специальные очистки.
Для отладки этих сообщений вы можете использовать QtMsgHandler qInstallMsgHandler (QtMsgHandler h)
и написать свой собственный обработчик сообщений, чтобы зафиксировать эти предупреждения. Если вы можете имитировать проблему, вы можете установить точку останова в сообщении и увидеть в стеке, откуда приходит сообщение.
void debugMessageHandler(QtMsgType type, const char *msg){
if(QString(msg).contains("The message you can see in the console")){
int breakPointOnThisLine(0);
}
switch (type) {
case QtDebugMsg:
fprintf(stderr, "Debug: %s\n", msg);
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s\n", msg);
break;
case QtFatalMsg:
fprintf(stderr, "Fatal: %s\n", msg);
abort();
}
}
Для того, чтобы очистить с деструктор и ребенок-родитель отношения корабля вы можете поймать близкий сигнал консоли и вызвать QCoreApplication::exit()
к экземпляру приложения.
#include <csignal>
#include <QtCore/QCoreApplication>
using namespace std;
struct CleanExit{
CleanExit() {
signal(SIGINT, &CleanExit::exitQt);
signal(SIGTERM, &CleanExit::exitQt);
signal(SIGBREAK, &CleanExit::exitQt) ;
}
static void exitQt(int sig) {
QCoreApplication::exit(0);
}
};
int main(int argc, char *argv[])
{
CleanExit cleanExit;
QCoreApplication a(argc, argv);
return a.exec();
}
почти совершенно.после того, как вы вызвали exit (0), вы должны сделать свой Qt-код для очистки где-то, что отсутствует в обработчике сигнала exitQt(). поэтому вам нужно связать код очистки Qt с сигналом aboutToQuit(). сигнал aboutToQuit выдается только после вызова qApp-> exit (0). –
C++ 11 упрощает процесс: 'signal (SIGTERM, [] (int sig) {qApp-> quit();});' – ManuelSchneid3r
Это не работает полностью. Я сделал объект, связанный с очисткой, дочерним элементом QApplication. Деструктор правильно вызывается, когда окно нормально закрывается. Но после выключения/выхода из системы дочерний деструктор QApplication никогда не вызывается. – galinette