Weder quit() noch exit(0) schließen mein Programm

Alles rund um die Programmierung mit Qt
Antworten
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Weder quit() noch exit(0) schließen mein Programm

Beitrag von KartoffelKiffer »

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
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:04, insgesamt 1-mal geändert.
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Versuch's einfach mal damit:

Code: Alles auswählen

void myClass::raushierSlot()
{
   QApplication::exit ();
}

Ciao,
Sephral
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag von KartoffelKiffer »

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
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:04, insgesamt 1-mal geändert.
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Hast du das "closeEvent()" überladen und das "event->accept()" vergessen?
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag von KartoffelKiffer »

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:

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;
}
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
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

Beitrag von KartoffelKiffer »

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.

Code: Alles auswählen

QTimer::singleShot(0, qApp, SLOT(quit()));
... ist des Rätsels Lösung.




Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:05, insgesamt 2-mal geändert.
Maxima
Beiträge: 27
Registriert: 23. Mai 2008 03:45

Beitrag von Maxima »

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... :)
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

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...
Maxima
Beiträge: 27
Registriert: 23. Mai 2008 03:45

Beitrag von Maxima »

PeterLustig hat geschrieben:Bitte Beiträge lesen...
Good point! (Könnte den Anschein haben ich hätte nicht...)

Deshalb:
Und das tut er lediglich (und auch nur) dann, wenn die Applikation sichtbar ist, und der Schließen-Knopf rechts oben gedrückt wird.
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.

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

Beitrag von KartoffelKiffer »

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.
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.

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.
Maxima
Beiträge: 27
Registriert: 23. Mai 2008 03:45

Beitrag von Maxima »

Das interessiert mich jetzt aber schon (..tüftel..:) )

Wenn Du das ev->ignore() mal wegläßt, funktioniert quit dann aus dem sysTray?

Ich kann Dir anbieten, daß ich den Code mal bei mir probiere (4.3 XP mingw ->PM)
Antworten