Qt: Comment gérer l'événement de l'utilisateur appuyant sur le bouton «X» (fermer)?
126
Je développe une application utilisant Qt. Je ne sais pas quel slot correspond à l'événement "l'utilisateur clique sur le bouton 'X' (fermer) du cadre de la fenêtre" c'est à dire ce bouton:
S'il n'y a pas de slot pour cela, quelqu'un peut-il me suggérer une autre méthode par laquelle je peux démarrer une fonction après que l'utilisateur a appuyé sur ce bouton de fermeture.
Si mon application est créée en sous-classant QApplication, comment puis-je réaliser la même chose que ci-dessus?
prakashpun
@ pra16 connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));devrait fonctionner. Voir la réponse de Sebastian ci-dessous.
Shiva
1
Vous pouvez également utiliser setAttribute(Qt::WA_QuitOnClose);pour MainWindow.
Borzh
Êtes-vous sûr que la sous-classification de QDialog n'appellera pas closeEvent? Cela fonctionne pour moi, et la documentation de QCloseEvent dit que le gestionnaire d'événements QWidget :: closeEvent () reçoit des événements de fermeture et QDialog est également un widget, non? Ou est-ce lié à l'ancienne version de Qt (<5.x) d'une manière ou d'une autre?
Dimitri Podbourski
1
@incBrain Même dans Qt 4.8, le bouton 'X' appelle closeEventun QDialog, mais si l'utilisateur appuie sur Echap sur le clavier, le QDialog se ferme sans appeler closeEvent.
asclepix
16
Eh bien, je l'ai. Une façon est de remplacer la méthode dans votre définition de classe et d'ajouter votre code dans cette fonction. Exemple:QWidget::closeEvent(QCloseEvent *event)
class foo :publicQMainWindow{
Q_OBJECT
private:void closeEvent(QCloseEvent*bar);// ...};void foo::closeEvent(QCloseEvent*bar){// Do something
bar->accept();}
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
devrait fonctionner. Voir la réponse de Sebastian ci-dessous.setAttribute(Qt::WA_QuitOnClose);
pour MainWindow.closeEvent
? Cela fonctionne pour moi, et la documentation de QCloseEvent dit que le gestionnaire d'événements QWidget :: closeEvent () reçoit des événements de fermeture et QDialog est également un widget, non? Ou est-ce lié à l'ancienne version de Qt (<5.x) d'une manière ou d'une autre?closeEvent
un QDialog, mais si l'utilisateur appuie sur Echap sur le clavier, le QDialog se ferme sans appelercloseEvent
.Eh bien, je l'ai. Une façon est de remplacer la méthode dans votre définition de classe et d'ajouter votre code dans cette fonction. Exemple:
QWidget::closeEvent
(QCloseEvent *event)
la source
Vous pouvez attacher un SLOT au
signal de votre QApplication. Ce signal doit être émis juste avant la fermeture de l'application.
la source
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
vous pouvez également réimplémenter le membre protégé QWidget :: closeEvent ()
la source