回答:
あなたが持っている場合は、メソッド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();
}
}
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
は動作するはずです。以下のセバスチャンの答えを見てください。
setAttribute(Qt::WA_QuitOnClose);
MainWindow にも使用できます。
closeEvent
か?QCloseEventのドキュメントには、イベントハンドラQWidget :: closeEvent()が閉じるイベントを受け取り、QDialogもウィジェットであると記載されています。それとも古いQtバージョン(<5.x)に何らかの関係がありますか?
closeEvent
QDialogを呼び出しますが、ユーザーがキーボードでEscを押すと、QDialogはを呼び出さずに閉じられcloseEvent
ます。
さて、私はそれを手に入れました。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();
}
SLOTを
void aboutToQuit();
QApplicationのシグナル。この信号は、アプリが閉じる直前に発生する必要があります。
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));