Richtiger Weg, um ein Qt-Programm zu beenden?


129

Wie soll ich ein Qt-Programm beenden, z. B. beim Laden einer Datendatei und bei festgestellter Dateibeschädigung, und der Benutzer muss diese App beenden oder die Datendatei neu starten?

Sollte ich:

  1. Anruf exit(EXIT_FAILURE)
  2. Anruf QApplication::quit()
  3. Anruf QCoreApplication::quit()

Und Unterschied zwischen (2) und (3)?

Antworten:


145

QApplication wird von QCoreApplication abgeleitet und erbt dabei quit()einen öffentlichen Slot von QCoreApplication, sodass zwischen QApplication::quit()und kein Unterschied besteht QCoreApplication::quit().

Wie wir in der Dokumentation lesen können QCoreApplication::quit()es „erzählt die Anwendung zu beenden mit dem Rückkehrcode 0 (Erfolg).“ . Wenn Sie beenden möchten, weil Sie eine Dateibeschädigung festgestellt haben, möchten Sie möglicherweise nicht mit dem Rückkehrcode QCoreApplication::exit()Null beenden, was Erfolg bedeutet. Sie sollten daher aufrufen, da Sie einen Rückkehrcode ungleich Null angeben können, der gemäß Konvention einen Fehler anzeigt.

Es ist wichtig zu beachten, dass "wenn die Ereignisschleife nicht ausgeführt wird, diese Funktion (QCoreApplication :: exit ()) nichts tut" . In diesem Fall sollten Sie also aufrufen exit(EXIT_FAILURE).


30

Sie können anrufen qApp.exit();. Ich benutze das immer und hatte nie ein Problem damit.

Wenn Ihre Anwendung eine Befehlszeilenanwendung ist, möchten Sie möglicherweise tatsächlich einen Exit-Code zurückgeben. Es liegt ganz bei Ihnen, was der Code ist.


3
Ich musste Folgendes tun:qApp->exit();
Frederick Ollinger


-2

Wenn Sie Ihre Anwendung über main () schließen müssen, können Sie diesen Code verwenden

int main(int argc, char *argv[]){
QApplication app(argc, argv);
...
if(!QSslSocket::supportsSsl()) return app.exit(0);
...
return app.exec();
}

Das Programm wird beendet, wenn OpenSSL nicht installiert ist


1
Ich denke das kompiliert nicht. app.exit (0) gibt kein int zurück. Verwenden Sie if(!QSslSocket::supportsSsl()) {return 0;};. Da app.exec () in dieser Zeile nicht aufgerufen wurde, führt app.exit (0) nichts aus, siehe Dokumentation zu QCoreApplication :: exit (): Wenn die Ereignisschleife nicht ausgeführt wird, führt diese Funktion nichts aus.
Sacha Guyer

-3
//How to Run App

bool ok = QProcess::startDetached("C:\\TTEC\\CozxyLogger\\CozxyLogger.exe");
qDebug() <<  "Run = " << ok;


//How to Kill App

system("taskkill /im CozxyLogger.exe /f");
qDebug() << "Close";

Beispiel


Die Frage ist nicht über das Trennen neuer Prozesse
Rookie-Codierer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.