web-dev-qa-db-ja.com

Qt:「X」(閉じる)ボタンを押すユーザーのイベントをどのように処理しますか?

Qtを使用してアプリケーションを開発しています。 「ユーザーがウィンドウフレームの「X」(閉じる)ボタンをクリックする」イベント、つまりこのボタンに対応するスロットがわかりません。

Close button of the window

このスロットがない場合、ユーザーがその閉じるボタンを押した後に機能を開始できる他の方法を誰か提案してください。

104

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

まあ、私はそれを得た。 1つの方法は、クラス定義で QWidget::closeEvent(QCloseEvent *event)メソッドをオーバーライドし、その関数にコードを追加することです。例:

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


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

SLOTを添付できます

void aboutToQuit();

qApplicationのシグナル。この信号は、アプリが閉じる直前に発生する必要があります。

12
Sebastian Lange

また、保護されたメンバーQWidget :: closeEvent()を再実装できます

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