2013-07-05 20 views

Odpowiedz

109

Jeśli masz QMainWindow można zastąpić closeEvent metody.

#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(); 
    } 
} 


Jeśli instacji do QDialog The closeEvent nie można nazwać i tak trzeba zastąpić 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

Dzięki za pełną odpowiedź. :) –

+0

Jeśli moja aplikacja jest tworzona przez podklasę QApplication, to jak mogę osiągnąć to samo co powyżej? – prakashpun

+0

@ pra16 'connect (qApp, SIGNAL (aboutToQuit()), to, SLOT (quitMyApp()));' powinien działać. Zobacz odpowiedź Sebastiana poniżej. –

14

Cóż, mam. Jednym ze sposobów jest zastąpienie metody QWidget::closeEvent(QCloseEvent *event) w definicji klasy i dodanie kodu do tej funkcji. Przykład:

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


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

można dołączyć dodatkowy slot do

void aboutToQuit(); 

sygnał Twojej aplikacji QApplication. Ten sygnał powinien zostać podniesiony tuż przed zamknięciem aplikacji.

+1

Użyliśmy tego rodzaju: '' connect (qApp, SIGNAL (aboutToQuit()), to, SLOT (quitMyApp())); '' –

+3

Jednak [cytat z dokumentacji] (http: //doc.qt. io/qt-5/qcoreapplication.html # aboutToQuit): "Zauważ, że w tym stanie nie jest możliwa interakcja użytkownika." – Ignitor

5

również można reimplement chroniony członek QWidget :: closeEvent()

void YourWidgetWithXButton::closeEvent(QCloseEvent *event) 
{ 
    // do what you need here 
    // then call parent's procedure 
    QWidget::closeEvent(event); 
} 
Powiązane problemy