Ft: Wie gehe ich mit dem Ereignis um, bei dem der Benutzer die Taste 'X' (Schließen) drückt?
126
Ich entwickle eine Anwendung mit Qt. Ich weiß nicht, welcher Steckplatz dem Ereignis entspricht, dass "der Benutzer auf die Schaltfläche 'X' (Schließen) des Fensterrahmens klickt", dh diese Schaltfläche:
Wenn es dafür keinen Steckplatz gibt, kann mir jemand eine andere Methode vorschlagen, mit der ich eine Funktion starten kann, nachdem der Benutzer diese Schaltfläche zum Schließen gedrückt hat.
Möglicherweise möchten Sie auch setAttribute(Qt::WA_QuitOnClose);für MainWindow verwenden.
Borzh
Sind Sie sicher, dass die Unterklasse QDialog nicht aufgerufen wird closeEvent? Es funktioniert für mich und die Dokumentation von QCloseEvent besagt, dass der Ereignishandler QWidget :: closeEvent () nahe Ereignisse empfängt und QDialog auch ein Widget ist, oder? Oder hängt es irgendwie mit der älteren Qt-Version (<5.x) zusammen?
Dimitri Podborski
1
@incBrain Selbst in Qt 4.8 ruft die ' closeEventX' -Taste einen QDialog auf, aber wenn der Benutzer Esc auf der Tastatur drückt, wird der QDialog geschlossen, ohne aufzurufen closeEvent.
Asclepix
16
Nun, ich habe es verstanden. Eine Möglichkeit besteht darin, die Methode in Ihrer Klassendefinition zu überschreiben und Ihren Code in diese Funktion einzufügen. Beispiel:QWidget::closeEvent(QCloseEvent *event)
class foo :publicQMainWindow{
Q_OBJECT
private:void closeEvent(QCloseEvent*bar);// ...};void foo::closeEvent(QCloseEvent*bar){// Do something
bar->accept();}
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
sollte funktionieren. Siehe Sebastians Antwort unten.setAttribute(Qt::WA_QuitOnClose);
für MainWindow verwenden.closeEvent
? Es funktioniert für mich und die Dokumentation von QCloseEvent besagt, dass der Ereignishandler QWidget :: closeEvent () nahe Ereignisse empfängt und QDialog auch ein Widget ist, oder? Oder hängt es irgendwie mit der älteren Qt-Version (<5.x) zusammen?closeEvent
X' -Taste einen QDialog auf, aber wenn der Benutzer Esc auf der Tastatur drückt, wird der QDialog geschlossen, ohne aufzurufencloseEvent
.Nun, ich habe es verstanden. Eine Möglichkeit besteht darin, die Methode in Ihrer Klassendefinition zu überschreiben und Ihren Code in diese Funktion einzufügen. Beispiel:
QWidget::closeEvent
(QCloseEvent *event)
quelle
Sie können einen SLOT an die anhängen
Signal Ihrer QApplication. Dieses Signal sollte kurz vor dem Schließen der App ausgelöst werden.
quelle
connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
Sie können auch das geschützte Mitglied QWidget :: closeEvent () erneut implementieren.
quelle