Qt: Как мне обрабатывать событие, когда пользователь нажимает кнопку "X" (закрыть)?

Я разрабатываю приложение с использованием Qt. Я не знаю, какой слот соответствует событию "пользователь, нажимая кнопку" X "(закрыть) оконного фрейма", то есть эта кнопка:

Close button of the window

Если для этого нет слота, может ли кто-нибудь предложить мне другой метод, с помощью которого я могу запустить функцию после нажатия пользователем этой кнопки закрытия.

Ответ 1

Если у вас есть QMainWindow, вы можете переопределить метод 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();
    }
}


Если вы подклассифицируете QDialog, closeEvent не будет вызываться, поэтому вам нужно переопределить 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();
    }
}

Ответ 2

Хорошо, я понял. Один из способов - переопределить метод QWidget::closeEvent (QCloseEvent *event) в определении вашего класса и добавить код в эту функцию. Пример:

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


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

Ответ 3

Вы можете подключить SLOT к

void aboutToQuit();

вашего QApplication. Этот сигнал должен быть поднят непосредственно перед закрытием приложения.

Ответ 4

Также вы можете переопределить защищенный член QWidget:: closeEvent()

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