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


126

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

ウィンドウの閉じるボタン

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

回答:


169

あなたが持っている場合は、メソッド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();
    }
}

QApplicationをサブクラス化してアプリケーションを作成した場合、どうすれば上記と同じことを実現できますか?
プラカシュプン2015

@ pra16 connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));は動作するはずです。以下のセバスチャンの答えを見てください。
Shiva

1
setAttribute(Qt::WA_QuitOnClose);MainWindow にも使用できます。
Borzh 2015年

QDialogのサブクラス化が呼び出されないことを確信していますcloseEventか?QCloseEventのドキュメントには、イベントハンドラQWidget :: closeEvent()が閉じるイベント受け取り、QDialogもウィジェットであると記載されています。それとも古いQtバージョン(<5.x)に何らかの関係がありますか?
Dimitri Podborski 2016年

1
@incBrain Qt 4.8でも「X」ボタンはcloseEventQDialogを呼び出しますが、ユーザーがキーボードでEscを押すと、QDialogはを呼び出さずに閉じられcloseEventます。
asclepix 2016年

16

さて、私はそれを手に入れました。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();
}


10

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

void YourWidgetWithXButton::closeEvent(QCloseEvent *event)
{
    // do what you need here
    // then call parent's procedure
    QWidget::closeEvent(event);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.