web-dev-qa-db-fra.com

Qt: Comment gérer l’événement de l’utilisateur en appuyant 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 clique sur le bouton 'X' (fermer) du cadre de la fenêtre", c.-à-d. Ce bouton:

Close button of the window

S'il n'y a pas de fente pour cela, quelqu'un peut-il me suggérer une autre méthode permettant de démarrer une fonction après que l'utilisateur a appuyé sur le bouton de fermeture.

104
The Peaceful Coder

Si vous avez un QMainWindow, vous pouvez remplacer la méthode closeEvent.

#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();
    }
}
144
asclepix

Eh bien, je l'ai. Une solution consiste à remplacer la méthode QWidget::closeEvent _(QCloseEvent *event)_ dans la définition de votre classe et à ajouter votre code à cette fonction. Exemple:

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


void foo::closeEvent(QCloseEvent *bar)
{
    // Do something
    bar->accept();
}
_
15
The Peaceful Coder

Vous pouvez attacher une fente au

void aboutToQuit();

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

12
Sebastian Lange

vous pouvez aussi 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);
}
7
Alexander