Qt: comment gérer l'événement où l'utilisateur appuie sur le bouton ' X ' (Fermer)?

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

Bouton fermer de la fenêtre

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 démarrer une fonction après que l'utilisateur appuie sur ce bouton de fermeture.

88
demandé sur Andreas Haferburg 2013-07-05 08:16:14

4 réponses

Si vous avez un QMainWindow vous pouvez remplacer 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 vous devez donc 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();
    }
}
126
répondu asclepix 2016-07-19 20:39:39

Eh bien, je l'ai. Une façon est de remplacer le QWidget::closeEvent(QCloseEvent *event) méthode dans votre définition de 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();
}
15
répondu The Peaceful Coder 2016-11-11 18:55:02

Vous pouvez attacher un emplacement au

void aboutToQuit();

Signal de votre QApplication. Ce signal devrait être déclenché juste avant la fermeture de l'application.

10
répondu Sebastian Lange 2013-07-05 10:44:05

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);
}
6
répondu Alexander 2015-11-27 09:44:41