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을 서브 클래 싱하여 내 응용 프로그램을 만든 경우 어떻게 위와 동일한 결과를 얻을 수 있습니까?
prakashpun

@ pra16 connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));이 작동합니다. 아래 Sebastian의 답변을 참조하십시오.
Shiva

1
setAttribute(Qt::WA_QuitOnClose);MainWindow 에도 사용할 수 있습니다 .
Borzh

서브 클래 싱 QDialog가 호출되지 closeEvent않습니까? 그것은 나를 위해 작동하고 QCloseEvent 의 문서에 따르면 이벤트 핸들러 QWidget :: closeEvent ()는 닫기 이벤트를 수신 하고 QDialog도 위젯입니다. 아니면 이전 Qt 버전 (<5.x)과 관련이 있습니까?
Dimitri Podborski

1
@incBrain Qt 4.8에서도 'X'버튼 closeEvent은 QDialog에서 호출 되지만 사용자 가 키보드에서 Esc 키 를 누르면를 호출하지 않고 QDialog가 닫힙니다 closeEvent.
asclepix

16

글쎄요. 한 가지 방법은 클래스 정의에서 메서드 를 재정의하고 해당 함수에 코드를 추가하는 것입니다. 예:QWidget::closeEvent(QCloseEvent *event)

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


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

12

SLOT을

void aboutToQuit();

QApplication의 신호. 이 신호는 앱이 종료되기 직전에 발생해야합니다.


2
우리는 종류의 그것을 사용 :connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
세바스찬 랭에게

3
그러나 문서에서 "이 상태에서는 사용자 상호 작용이 불가능하다는 점에 유의하십시오."
Ignitor

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.