Weder quit() noch exit(0) schließen mein Programm
-
KartoffelKiffer
- Beiträge: 101
- Registriert: 27. Februar 2008 15:59
Weder quit() noch exit(0) schließen mein Programm
Hallo,
wie die Überschrift schon sagt, bekomme ich meine Applikation nicht geschlossen.
Hintergrund: Ich starte das Programm versteckt und mit einem Symbol in der SystemTrayBar. Diese TrayBar enthält ein Menü, mit einem Eintrag "Quit".
Dieser Eintrag wird auf ein Signal triggered() überwacht und startet bei Betätigung den Slot quit() von qApp "connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));". Wie man sich denken kann, schließt die Anwendung einwandfrei.
Möchte ich nun im MainWidget (wird durch die main-Methode aufgerufen) nach Bearbeitung einer Funktion dieses per qApp->quit() schließen, so passiert garnichts.
Weder ein Signal/Slot -Prinzip noch das Ausprobieren von quit und exit(0) bringen die Applikation zum Schließen.
Jetzt habe ich spasseshalber auf ein Signal lauschen lassen, dass emittet wird sobald die Funktion durchlaufen ist, welches den Slot trigger() des TrayBar-Menüs aufruft. Im Prinzip simuliere ich also einen Klick auf "Quit", welcher wiederum einen Slot quit() in qApp aufruft (s.o.).
Die Applikation um die es hier geht, wird von einer anderen Applikation per QProcess->start(...) aufgerufen. Dort fange ich ein Signal finished() ab, welches NUR dann greift, wenn im TrayBar-Menü auf "Quit" geklickt wird. Weder ein exit(0) noch ein quit() in der Child-Applikation lösen das Signal in der Parent-Applikation aus.
Wo kann da denn noch der Wurm drin stecken? So langsam ist mein Latein am Ende...
Mfg KK
wie die Überschrift schon sagt, bekomme ich meine Applikation nicht geschlossen.
Hintergrund: Ich starte das Programm versteckt und mit einem Symbol in der SystemTrayBar. Diese TrayBar enthält ein Menü, mit einem Eintrag "Quit".
Dieser Eintrag wird auf ein Signal triggered() überwacht und startet bei Betätigung den Slot quit() von qApp "connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));". Wie man sich denken kann, schließt die Anwendung einwandfrei.
Möchte ich nun im MainWidget (wird durch die main-Methode aufgerufen) nach Bearbeitung einer Funktion dieses per qApp->quit() schließen, so passiert garnichts.
Weder ein Signal/Slot -Prinzip noch das Ausprobieren von quit und exit(0) bringen die Applikation zum Schließen.
Jetzt habe ich spasseshalber auf ein Signal lauschen lassen, dass emittet wird sobald die Funktion durchlaufen ist, welches den Slot trigger() des TrayBar-Menüs aufruft. Im Prinzip simuliere ich also einen Klick auf "Quit", welcher wiederum einen Slot quit() in qApp aufruft (s.o.).
Die Applikation um die es hier geht, wird von einer anderen Applikation per QProcess->start(...) aufgerufen. Dort fange ich ein Signal finished() ab, welches NUR dann greift, wenn im TrayBar-Menü auf "Quit" geklickt wird. Weder ein exit(0) noch ein quit() in der Child-Applikation lösen das Signal in der Parent-Applikation aus.
Wo kann da denn noch der Wurm drin stecken? So langsam ist mein Latein am Ende...
Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:04, insgesamt 1-mal geändert.
Versuch's einfach mal damit:
Ciao,
Sephral
Code: Alles auswählen
void myClass::raushierSlot()
{
QApplication::exit ();
}
Ciao,
Sephral
-
KartoffelKiffer
- Beiträge: 101
- Registriert: 27. Februar 2008 15:59
Hallo,
schonmal danke für die Bemühungen.
Nur leider greift auch diese Methode nicht. Was ich allerdings bemerkt habe: Das Signal wird emitted, dieses überprüfe ich, indem ich im Slot eine MessageBox anzeigen lasse. Das exit() zeigt vorerst garkeine Wirkung, wenn es alleine im Slot steht. Lasse ich hinter dem exit() allerdings noch eine MessageBox stehen, so blinkt diese ganz kurz auf, und verschwindet sofort wieder.
Also irgendwie beendet sich die Applikation schon, nur schließt sich einfach nicht.
Ich habe auch schon ettliche Slots von QApplication durch, erst ein closeAllWindows() gemacht, daraufhin ein quit() etc. Nur bleibt sie immer am Leben. Auch wenn ich die Applikation nicht in die TrayBar schicke, sondern "Standalone" laufen lasse passiert garnichts.
Irgendwie glaube ich fast, dass es etwas ganz banales ist, nur gehen mir langsam die Ideen aus.
Mfg KK
schonmal danke für die Bemühungen.
Nur leider greift auch diese Methode nicht. Was ich allerdings bemerkt habe: Das Signal wird emitted, dieses überprüfe ich, indem ich im Slot eine MessageBox anzeigen lasse. Das exit() zeigt vorerst garkeine Wirkung, wenn es alleine im Slot steht. Lasse ich hinter dem exit() allerdings noch eine MessageBox stehen, so blinkt diese ganz kurz auf, und verschwindet sofort wieder.
Also irgendwie beendet sich die Applikation schon, nur schließt sich einfach nicht.
Ich habe auch schon ettliche Slots von QApplication durch, erst ein closeAllWindows() gemacht, daraufhin ein quit() etc. Nur bleibt sie immer am Leben. Auch wenn ich die Applikation nicht in die TrayBar schicke, sondern "Standalone" laufen lasse passiert garnichts.
Irgendwie glaube ich fast, dass es etwas ganz banales ist, nur gehen mir langsam die Ideen aus.
Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:04, insgesamt 1-mal geändert.
-
KartoffelKiffer
- Beiträge: 101
- Registriert: 27. Februar 2008 15:59
Jein...
Ich überlade zwar die Funktion event, fange auch das QEvent::Close ab und unterbinde dies, aber er springt trotz exit() nicht in dieses Event herein. Hier ein Codeausschnitt des Überladens:
Sinn und Zweck des Ganzen ist einfach der, dass ich ein Schließen des Programmes unterbinden möchte, er also in die TrayBar mittels hide() geschickt werden soll. Ich hatte auch zuerst gedacht, dass er in die case-Anweisung des QEvent::Close geht, und das Programm deshalb nicht schließt (da mit ev->ignore() unterbunden). Darum habe ich an diesem Punkt eine MessageBox liegen, die mir anzeigen soll, wann er in den case-Block wandert. Und das tut er lediglich (und auch nur) dann, wenn die Applikation sichtbar ist, und der Schließen-Knopf rechts oben gedrückt wird.
Weiteren Unfug mit den Events treibe ich nicht.
Mfg KK
Ich überlade zwar die Funktion event, fange auch das QEvent::Close ab und unterbinde dies, aber er springt trotz exit() nicht in dieses Event herein. Hier ein Codeausschnitt des Überladens:
Code: Alles auswählen
bool Program::event(QEvent *ev)
{
bool rv;
switch(ev->type())
{
case QEvent::Hide:
restoreAction->setEnabled(true);
hideAction->setEnabled(false);
break;
case QEvent::Show:
restoreAction->setEnabled(false);
hideAction->setEnabled(true);
break;
case QEvent::Close:
QMessageBox::information(0, "", "durch...");
hide();
ev->ignore();
break;
default:
rv = QWidget::event(ev);
}
return rv;
}
Weiteren Unfug mit den Events treibe ich nicht.
Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:05, insgesamt 1-mal geändert.
-
KartoffelKiffer
- Beiträge: 101
- Registriert: 27. Februar 2008 15:59
Hallo,
ich bekomme mein Programm nun endlich geschlossen. Zwar nicht ganz so wie ich mir das gedacht habe, aber es funktioniert. Warum weiß ich zwar nicht, aber es läuft.
... ist des Rätsels Lösung.
Mfg KK
ich bekomme mein Programm nun endlich geschlossen. Zwar nicht ganz so wie ich mir das gedacht habe, aber es funktioniert. Warum weiß ich zwar nicht, aber es läuft.
Code: Alles auswählen
QTimer::singleShot(0, qApp, SLOT(quit()));Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:05, insgesamt 2-mal geändert.
-
PeterLustig
- Beiträge: 386
- Registriert: 21. November 2007 20:07
Maxima hat geschrieben:Hi KartoffelKiffer,
wenn Du den close-event ignorierst, wird er doch auch nicht weitergegeben?!? Um ihn dann doch noch zu erzeugen bzw weiterzugeben löst Du dann einen timer-event aus??
Ich verstehe nicht warum Du das ignorierst, wenn Du es doch willst?
Dankbar für jede Erleuchtung...
Bitte Beiträge lesen...
Good point! (Könnte den Anschein haben ich hätte nicht...)PeterLustig hat geschrieben:Bitte Beiträge lesen...
Deshalb:
Die messageBox erscheint vielleicht nur deshalb nicht, weil es ja hidden ist, dh, nur weil die messagebox nicht gesehen wird, bedeutet nicht, daß das Program nicht in den case springt.Und das tut er lediglich (und auch nur) dann, wenn die Applikation sichtbar ist, und der Schließen-Knopf rechts oben gedrückt wird.
Wenn dem so wäre, wäre es in diesem Fall, daß das quit() aus dem SystTray ausgelöst werden soll, nötig, das ignore() zu ignorieren.
-
KartoffelKiffer
- Beiträge: 101
- Registriert: 27. Februar 2008 15:59
Good point too! Aber ich habe auch den Versuch gestartet eine Mitteilung in eine Datei zu schreiben, anstatt die MessageBox zu zeigen. Wie gesagt, ich habe einiges probiert, und auch viele Quellen ausgeschlossen. Eben darum stelle ich solch "simple" Frage auch hier öffentlich im Forum.Die messageBox erscheint vielleicht nur deshalb nicht, weil es ja hidden ist, dh, nur weil die messagebox nicht gesehen wird, bedeutet nicht, daß das Program nicht in den case springt.
Zumal habe ich bei MessageBox´en das Problem, dass wenn ich eine anzeigen möchte, obwohl das Fenster/Programm 'hidden' ist, jenes abstürzt. Aber auch wirklich klanglos abstürzt. Es kommt weder ein Fehler im Speicher noch sonst irgendein Hinweis darauf, dass das Programm nicht mehr läuft.
Bislang wurde ich bei meinem Problem nicht erleuchtet, der Aha-Effekt liegt immer noch schlafend. Darum muss ich mich mit diesem, zugegebenermaßen, Dirty-Workaround zufriedenstellen.
Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:05, insgesamt 1-mal geändert.