152 votes

Qt : Comment gérer l'événement de l'utilisateur qui appuie sur le bouton 'X' (fermeture) ?

Je développe une application en utilisant Qt. Je ne sais pas quel slot correspond à l'événement "l'utilisateur cliquant sur le bouton 'X' (fermeture) du cadre de la fenêtre", c'est-à-dire ce bouton :

Close button of the window

S'il n'y a pas d'emplacement pour cela, quelqu'un peut-il me suggérer une autre méthode par laquelle je peux lancer une fonction après que l'utilisateur ait appuyé sur le bouton de fermeture.

201voto

asclepix Points 1322

Si vous avez un QMainWindow vous pouvez passer outre closeEvent méthode.

#include <QCloseEvent>
void MainWindow::closeEvent (QCloseEvent *event)
{
    QMessageBox::StandardButton resBtn = QMessageBox::question( this, APP_NAME,
                                                                tr("Are you sure?\n"),
                                                                QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes,
                                                                QMessageBox::Yes);
    if (resBtn != QMessageBox::Yes) {
        event->ignore();
    } else {
        event->accept();
    }
}

Si vous sous-classez un QDialog le closeEvent ne sera pas appelé et donc vous devez remplacer reject() :

void MyDialog::reject()
{
    QMessageBox::StandardButton resBtn = QMessageBox::Yes;
    if (changes) {
        resBtn = QMessageBox::question( this, APP_NAME,
                                        tr("Are you sure?\n"),
                                        QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes,
                                        QMessageBox::Yes);
    }
    if (resBtn == QMessageBox::Yes) {
        QDialog::reject();
    }
}

21voto

Shravan Points 425

Eh bien, je l'ai. Une façon de faire est d'outrepasser le QWidget::closeEvent(QCloseEvent *event) dans la définition de votre classe et ajoutez votre code dans cette fonction. Exemple :

class foo : public QMainWindow
{
    Q_OBJECT
private:
    void closeEvent(QCloseEvent *bar);
    // ...
};

void foo::closeEvent(QCloseEvent *bar)
{
    // Do something
    bar->accept();
}

15voto

Sebastian Lange Points 3480

Vous pouvez attacher un SLOT au

void aboutToQuit();

de votre QApplication. Ce signal doit être levé juste avant la fermeture de l'application.

12voto

Alexander Points 139

Vous pouvez également réimplémenter le membre protégé QWidget::closeEvent()

void YourWidgetWithXButton::closeEvent(QCloseEvent *event)
{
    // do what you need here
    // then call parent's procedure
    QWidget::closeEvent(event);
}

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