답변:
있는 경우 메서드 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()));
이 작동합니다. 아래 Sebastian의 답변을 참조하십시오.
setAttribute(Qt::WA_QuitOnClose);
MainWindow 에도 사용할 수 있습니다 .
closeEvent
않습니까? 그것은 나를 위해 작동하고 QCloseEvent 의 문서에 따르면 이벤트 핸들러 QWidget :: closeEvent ()는 닫기 이벤트를 수신 하고 QDialog도 위젯입니다. 아니면 이전 Qt 버전 (<5.x)과 관련이 있습니까?
closeEvent
은 QDialog에서 호출 되지만 사용자 가 키보드에서 Esc 키 를 누르면를 호출하지 않고 QDialog가 닫힙니다 closeEvent
.
글쎄요. 한 가지 방법은 클래스 정의에서 메서드 를 재정의하고 해당 함수에 코드를 추가하는 것입니다. 예:QWidget::closeEvent
(QCloseEvent *event)
class foo : public QMainWindow
{
Q_OBJECT
private:
void closeEvent(QCloseEvent *bar);
// ...
};
void foo::closeEvent(QCloseEvent *bar)
{
// Do something
bar->accept();
}