Seite 1 von 1

QMessageBox::Ok schließt das ganze Programm

Verfasst: 29. Mai 2006 09:44
von Johannes
Hallo zusammen,

Hoffe, das Thema wurde noch nicht behandelt, mit der Suche konnte ich es jedenfalls nicht finden.

Ich entwickle mit Qt 3.3.5 ein Tool, mit dem ich auf Chipkarten die PIN wechseln kann. (WinXP SP2)

Das Tool an sich funktioniert wunderbar, in einem zusätzlichen Thread werden die Kartenleser auf Änderungen überwacht (ob Karte gesteckt, gezogen, ungültig, usw.). Je nach Zustand aktivieren oder deaktivieren sich Teile des GUIs.

Steckt zu Programmbeginn eine Karte im Leser, bekomme ich eine Nachricht mit einer QMessageBox, welche mich darauf hinweist, dass die Karte noch nicht benutzt wurde und ich eine Werks-PIN eingeben muss. So solls auch sein. Diese MessageBox kann ich auch wunderbar wegklicken, wie es sein muss.

Steckt nun aber zum Programmbeginn noch keine Karte und ich stecke die Karte während des Betriebs, springt mein Thread darauf an, sendet ein entsprechendes Signal und gibt mir die richtige MessageBox. Klicke ich aber bei dieser auf Ok, schließt sich das Programm ohne jegliche Fehlermeldung. Das Kompilieren funktionierte zuvor auch ohne jegliche Fehler.

Ich sitze an dem Problem nun schon mehrere Tage und weiß nicht mehr weiter.
Gibt es da einen bekannten Bug oder liegt der Fehler eher in meinem Code?
Falls ich Code posten soll, sagt mir, welchen Teil. Am Aufruf der MessageBox kanns nicht liegen, da kann man ja nicht viel falsch machen.

Vielen Dank im Voraus!

JOHANNES

Verfasst: 29. Mai 2006 09:49
von Christian81
Dann debugge doch einfach mal - sollte doch nicht so schwer sein an der Stelle nach der Message-Box einen Breakpoint zu setzen und zu schauen was passiert, oder?

Verfasst: 29. Mai 2006 09:56
von Johannes
alles schon gemacht...

Keine Fehler. Das Programm schließt wunderbar und sauber nach der MessageBox. Das Blöde ist eben nur, dass es das da nicht soll.

Kann es sein, dass das Hauptprogramm, den Rückgabewert der MessageBox so interpretiert, dass das Hauptprogramm geschlossen wird?

Verfasst: 29. Mai 2006 10:00
von Christian81
Johannes hat geschrieben: Kann es sein, dass das Hauptprogramm, den Rückgabewert der MessageBox so interpretiert, dass das Hauptprogramm geschlossen wird?
Das musst du das Hauptprogramm fragen. Dort einen Breakpoint und schauen was passiert. :)

Verfasst: 29. Mai 2006 11:38
von BartSimpson
läuft dein Thread eventuell aus?

Verfasst: 29. Mai 2006 11:45
von Johannes
Der Thread wird erst bei Programmende beendet, die Kartenleser müssen ja immer überwacht werden.
Ich vermute, die Fehlerquelle gefunden zu haben, ich melde mich wieder, wenn ich es habe.

Verfasst: 29. Mai 2006 11:53
von Querdenker
Hi,

das liegt in main() und in QApplication. Die QMessageBox ist zwar ein Dialog, wird aber von QApplication wie ein MainWidget behandelt wenn es das einzigste Window war.
Wird es geschlossen, so notiert QApplication das beenden des letzten Window und beendet die App.
Diese Eigenschaft lässt sich aber mit einem bool abstellen.

quitOnLastWindowClosed(false);

Verfasst: 29. Mai 2006 11:55
von Johannes
Das habe ich auch bereits gesehen. Leider gibt es diese Methode nur für Qt 4.x. Ich verwende noch Qt 3.3.5
Aber trotzdem danke für den Tipp.

Verfasst: 29. Mai 2006 17:02
von Querdenker
Hi,

einzigste Alternative für deine Qt-Version: Erstelle einfach ein Widget. Du kannst es verstecken. Wenn die App beendet werden soll, so terminiere einfach das Widget.
Das trickst QApplication aus ;) Auf jedenfall kann dann die App jede MsgBox anzeigen.