142 votes

Comment quitter correctement un programme Qt ?

Comment quitter un programme Qt, par exemple en chargeant un fichier de données, et en découvrant une corruption du fichier, et l'utilisateur doit quitter cette application ou relancer le fichier de données ?

Je devrais :

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

Et la différence entre (2) et (3) ?

162voto

Bill Points 4521

QApplication est dérivé de QCoreApplication et hérite ainsi de quit() qui est un emplacement public de QCoreApplication Il n'y a donc aucune différence entre QApplication::quit() et QCoreApplication::quit() .

Comme nous pouvons le lire dans la documentation de QCoreApplication::quit() il "indique à l'application de quitter avec le code de retour 0 (succès)." . Si vous voulez sortir parce que vous avez découvert une corruption de fichier, vous ne voudrez peut-être pas sortir avec le code de retour zéro qui signifie le succès, vous devriez donc appeler QCoreApplication::exit() car vous pouvez fournir un returnCode non nul qui, par convention, indique une erreur.

Il est important de noter que "si la boucle d'événement n'est pas en cours d'exécution, cette fonction (QCoreApplication::exit()) ne fait rien" Dans ce cas, vous devez appeler exit(EXIT_FAILURE) .

32voto

this.lau_ Points 23290

Vous pouvez appeler qApp.exit(); . Je l'utilise toujours et n'ai jamais eu de problème avec elle.

Si votre application est une application en ligne de commande, vous pourriez en effet vouloir renvoyer un code de sortie. C'est à vous de décider quel est ce code.

4 votes

Je devais faire ce qui suit : qApp->exit();

1voto

systemcpro Points 359

En cherchant à répondre à cette question, j'ai découvert cet exemple dans le site Web de la Commission européenne. documentation .

QPushButton *quitButton = new QPushButton("Quit");
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection);

Mutatis mutandis pour votre action particulière, bien sûr.

Avec cette note.

Une bonne pratique consiste à toujours connecter les signaux à ce slot en utilisant une QueuedConnection. Si un signal connecté (non mis en file d'attente) à ce slot est est émis avant que le contrôle n'entre dans la boucle d'événement principale (par exemple, avant que "int main" appelle exec()), le slot n'a pas d'effet et l'application ne sort jamais. sortie de l'application. L'utilisation d'une connexion en file d'attente garantit que le slot ne sera pas invoqué avant que le contrôle n'entre dans la boucle d'événements principale. ne sera pas invoqué avant que le contrôle n'entre dans la boucle d'événements principale.

Il est courant de connecter le signal QGuiApplication::lastWindowClosed() à quit()

0voto

Si vous utilisez Qt Jambi, cela devrait fonctionner :

QApplication.closeAllWindows();

-2voto

si vous devez fermer votre application à partir de main(), vous pouvez utiliser ce code

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

Le programme sera interrompu si OpenSSL n'est pas installé.

1 votes

Je pense que cela ne compile pas. app.exit(0) ne retourne pas un int. Utilisez if(!QSslSocket::supportsSsl()) {return 0;}; . Parce que app.exec() n'a pas été appelé à cette ligne, app.exit(0) ne fait rien, voir la documentation de QCoreApplication::exit() : Si la boucle d'événement n'est pas en cours d'exécution, cette fonction ne fait rien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X