Bereinigung sollte von Destruktoren und Kind-Eltern-Beziehung behandelt werden.
Machen Sie Ihr Hauptobjekt (das Hauptobjekt) zu einem untergeordneten Objekt von QApplication, sodass es mit allen untergeordneten Objekten vor QApplication zerstört wird.
Sind Sie sicher, dass Sie alle Ihre Threads getötet haben? Wenn es einen Thread mit einer Ereignisschleife ist sicher QThread::quit()
rufen Sie die Ereignisschleife zu beenden, bevor Sie QThread::wait()
rufen
Sie können auch die Leere verwenden QApplication::qAddPostRoutine (QtCleanUpFunction ptr)
einige spezielle Bereinigung zu tun.
Zum Debuggen dieser Nachrichten können Sie QtMsgHandler qInstallMsgHandler (QtMsgHandler h)
verwenden und schreiben Sie Ihren eigenen Message-Handler, um diese Warnungen zu erfassen. Wenn Sie das Problem simulieren können, können Sie einen Haltepunkt für die Nachricht festlegen und auf dem Stapel sehen, von dem die Nachricht stammt.
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();
}
}
Um mit destructor und Eltern-Kind-Beziehung Schiff zu säubern Sie die Konsole schließt Signal und QCoreApplication::exit()
auf die Anwendungsinstanz anrufen zu fangen.
#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();
}
fast abgeschlossen.Sobald Sie exit (0) aufgerufen haben, müssen Sie Ihren Qt-spezifischen Bereinigungscode irgendwo eingeben, der nicht im Signalhandler exitQt() enthalten ist. Also musst du deinen Qt Cleanup Code an das aboutToQuit() Signal binden. Das Signal aboutToQuit wird erst ausgegeben, wenn qApp-> exit (0) aufgerufen wird. –
C++ 11 macht es einfacher: 'signal (SIGTERM, [] (int sig) {qApp-> quit();});' – ManuelSchneid3r
Dies funktioniert nicht vollständig. Ich habe das Bereinigungsobjekt zu einem Kind von QApplication gemacht. Der Destruktor wird ordnungsgemäß aufgerufen, wenn das Fenster normal geschlossen wird. Beim Herunterfahren/Abmelden des Systems wird der untergeordnete Kinddestruktor QApplication jedoch nie aufgerufen. – galinette