P: Jak mam obsłużyć zdarzenie użytkownika naciskając przycisk „X” (zamknij)?
126
Tworzę aplikację przy użyciu Qt. Nie wiem, który slot odpowiada zdarzeniu „kliknięcia przez użytkownika przycisku 'X' (zamknij) ramy okna”, czyli tego przycisku:
Jeśli nie ma na to miejsca, czy ktoś może zasugerować mi inną metodę, dzięki której mogę uruchomić funkcję po naciśnięciu przez użytkownika przycisku zamykającego.
Jeśli moja aplikacja została utworzona przez podklasę QApplication, jak mogę osiągnąć to samo, co powyżej?
prakashpun
@ pra16 connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));powinno działać. Zobacz odpowiedź Sebastiana poniżej.
Shiva,
1
Możesz również chcieć użyć setAttribute(Qt::WA_QuitOnClose);dla MainWindow.
Borzh
Czy jesteś pewien, że podklasa QDialog nie wywoła closeEvent? To działa dla mnie, a dokumentacja QCloseEvent mówi, że program obsługi zdarzeń QWidget :: closeEvent () odbiera zdarzenia zamknięcia, a QDialog jest również widżetem, prawda? Czy jest to w jakiś sposób powiązane ze starszą wersją Qt (<5.x)?
Dimitri Podborski
1
@incBrain Nawet w Qt 4.8 przycisk „X” wywołuje closeEventQDialog, ale jeśli użytkownik naciśnie Esc na klawiaturze, QDialog zostanie zamknięty bez wywołania closeEvent.
asclepix
16
Cóż, rozumiem. Jednym ze sposobów jest zastąpienie metody w definicji klasy i dodanie kodu do tej funkcji. Przykład:QWidget::closeEvent(QCloseEvent *event)
class foo :publicQMainWindow{
Q_OBJECTprivate:void closeEvent(QCloseEvent*bar);// ...};void foo::closeEvent(QCloseEvent*bar){// Do something
bar->accept();}
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
powinno działać. Zobacz odpowiedź Sebastiana poniżej.setAttribute(Qt::WA_QuitOnClose);
dla MainWindow.closeEvent
? To działa dla mnie, a dokumentacja QCloseEvent mówi, że program obsługi zdarzeń QWidget :: closeEvent () odbiera zdarzenia zamknięcia, a QDialog jest również widżetem, prawda? Czy jest to w jakiś sposób powiązane ze starszą wersją Qt (<5.x)?closeEvent
QDialog, ale jeśli użytkownik naciśnie Esc na klawiaturze, QDialog zostanie zamknięty bez wywołaniacloseEvent
.Cóż, rozumiem. Jednym ze sposobów jest zastąpienie metody w definicji klasy i dodanie kodu do tej funkcji. Przykład:
QWidget::closeEvent
(QCloseEvent *event)
źródło
Możesz dołączyć SLOT do
sygnał twojego QApplication. Ten sygnał powinien zostać podniesiony tuż przed zamknięciem aplikacji.
źródło
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
również możesz ponownie zaimplementować chroniony element członkowski QWidget :: closeEvent ()
źródło