2013-07-05 3 views
78

Я разрабатываю приложение с использованием Qt. Я не знаю, какой слот соответствует случае «пользователь, нажав на кнопку (Закрыть) оконную раму„X“» т.е. этой кнопки:Qt: Как я могу обработать событие, когда пользователь нажал кнопку «X» (закрыть)?

Close button of the window

Если нет слота для это может кто-нибудь предложить мне другой метод, с помощью которого я могу запустить функцию после нажатия пользователем этой кнопки закрытия.

ответ

109

Если у вас есть 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(); 
    } 
} 
+1

Спасибо за полный ответ. :) –

+0

Если мое приложение создано путем подкласса QApplication, то как я могу достичь того же, что и выше? – prakashpun

+0

@ pra16 'connect (qApp, SIGNAL (aboutToQuit()), это, SLOT (quitMyApp()));' должен работать. См. Ответ Себастьяна ниже. –

14

Ну, я понял. Один из способов - переопределить метод в определении вашего класса и добавить код в эту функцию. Пример:

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


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

Вы можете прикрепить SLOT к

void aboutToQuit(); 

сигнал вашего QApplication. Этот сигнал должен быть поднят непосредственно перед закрытием приложения.

+1

Мы использовали это как: '' connect (qApp, SIGNAL (aboutToQuit()), это, SLOT (quitMyApp())); '' –

+3

Однако [цитата из документации] (http: //doc.qt. io/qt-5/qcoreapplication.html # aboutToQuit): «Обратите внимание, что в этом состоянии невозможно взаимодействие с пользователем». – Ignitor

5

также вы можете переопределить защищенный член QWidget :: CloseEvent()

void YourWidgetWithXButton::closeEvent(QCloseEvent *event) 
{ 
    // do what you need here 
    // then call parent's procedure 
    QWidget::closeEvent(event); 
} 
Смежные вопросы