Seite 1 von 1

QMessageBox blockiert oder doch nicht nicht? [anders Gelöst]

Verfasst: 12. Juni 2009 03:53
von speedy
Hi

also jetzt hab ich ein komisches Problem ... zumindest kapier ich das nicht.
mal mein Quelltext:

Code: Alles auswählen

void gunclient::incomming_errormsg(QString msg)
{
if (last_error_msg != msg)
	{
	last_error_msg = msg;
	ausgabefeld->append(msg);
	QMessageBox msgBox;
	msgBox.setText(QString("Error: %1").arg(msg));
	msgBox.exec();
	}
printf("Fehler vom Server empfangen\n");
}
jetzt verstehe ich das verhalten von meinem Programm nicht so wirklich...
Läuft jetzt mein Programm im Hintergrund weiter oder nicht???
Im Hintergrund ändert er noch Labels und printf's gehen auch noch an die Konsole.

Aber er diskonnectet mich von meinem Serverprogramm durch mein eingebautes Timeout.
Ich hab ein QTimer laufen der ein "Ping" sendet.
Mein Server antwortet darauf mit "Pong".
Anscheinend wird aber kein Ping mehr aus meinem Clientprogramm ausgelöst...

Also wenn ich das richtig in der Doku gelesen hab, ist doch QMessagesBox beim exec() eine blockierende funktion ...
Wieso läuft da überhaupt noch was im hintergrund???

Gibts auch eine nicht blockiernende möglichkeit?
Hab eigentlich keine lust das in ein QThread zu packen ...

Ansonsten mache ich das nur mit einem QWidget ...
Kann man das irgendwie zwingen immer im vodergrund zu bleiben?

mfg speedy

Verfasst: 12. Juni 2009 08:17
von upsala
Durch das exec läuft weiterhin deine Event-Routine und somit können weiterhin events ausgewertet werden.
Blockierend heist in diesem Zusammenhang nur, daß die anderen Widgets deiner Anwendung keine Maus- und Tastaturevents mehr bekommen.
Den Rest verrät dir dein Debugger...

Verfasst: 12. Juni 2009 15:44
von speedy
da muss ich mal heute abend schauen was da wo noch passiert.
Hab jetzt leider keine Zeit, will gleich zum Tanzen.

Verfasst: 12. Juni 2009 16:54
von solarix
<OT>
Hab jetzt leider keine Zeit, will gleich zum Tanzen.
Also ich hatte während meiner DA keine Zeit zum Tanzen
</OT>
Aber er diskonnectet mich von meinem Serverprogramm durch mein eingebautes Timeout.
Ist evt. "incomming_errormsg()" ein Slot, den du (indirekt mittels Signal) aus der Socketverarbeitung (z.B. nach dem Empfang bestimmter Daten) aufrufst?

Verfasst: 12. Juni 2009 21:12
von speedy
Ist evt. "incomming_errormsg()" ein Slot, den du (indirekt mittels Signal) aus der Socketverarbeitung (z.B. nach dem Empfang bestimmter Daten) aufrufst?
Ja

Ah ... mach genau das dann probleme.
Weil er den Slot nicht beendet solange die QMessageBox noch da ist...
hmm
ich schreibs mal grade um das da nur ein signal kommt und nicht den slot direkt aufruft.

Verfasst: 12. Juni 2009 21:23
von speedy
also genau da hängts dann

Code: Alles auswählen

printf("Error vor emit\n");
			emit incomming_errormsg_signal(einzeldata);
printf("Error nach emit\n");
"Error vor emit" wird ausgegeben und "Error nach emit" erst nachdem ich die QMessageBox weg geklickt habe.
Ist mir ja eigentlich auch logisch ...
aber wieso werden dann die anderen signale die von dem QTimer kommen noch verarbeitet ...

Hilft wohl alles nichts ... werd wohl meine eigenes QWidget erstellen was nicht blockiert.

EDIT: Achso der teil code ist aus der auswertung der TCP daten die ankommen.

Verfasst: 12. Juni 2009 22:12
von speedy
naja vielleicht nicht die eleganteste lösung ...
aber so funktionierts eher wie ich das möchte.

Code: Alles auswählen

void gunclient::incomming_errormsg(QString msg)
{
if (msg == QString("no Error"))
	{
	last_error_msg = msg;
	maininfo_label->setText(QString("Error: keine"));
	}

if (last_error_msg != msg)
	{
	last_error_msg = msg;
//	ausgabefeld->append(msg);
//	QMessageBox msgBox;
//	msgBox.setText(QString("Error: %1").arg(msg));
//	msgBox.exec();
//	connecttoserver();

	QWidget *msgW = new QWidget();
	msgW->setWindowTitle("FEHLER !");
	QGridLayout *gLayout = new QGridLayout(msgW);
	QLabel *label1 = new QLabel(QString("Error: %1").arg(msg));
	QPushButton *button1 = new QPushButton("OK");
	connect (button1, SIGNAL(clicked()), msgW, SLOT(deleteLater()));
	gLayout->addWidget(label1, 0, 0);
	gLayout->addWidget(button1, 1, 0);

//	msgW->setLayout(gLayout);
	msgW->show();
	maininfo_label->setText(QString("Error: %1").arg(msg));
	}
if (msg != QString("no Error")) printf("Fehler vom Server empfangen\n");
}
<OT>
<OT>
Zitat:

Hab jetzt leider keine Zeit, will gleich zum Tanzen.

Also ich hatte während meiner DA keine Zeit zum Tanzen
</OT>
Ohne Tanzen gehe ich ein :)
Hilft mir auch mal wieder ein Klaren Kopf zu bekommen.
Wobei bei mir warscheinlich auch noch die Zeit kommt wo ich nicht mal rauskomme :cry:
Hab noch etwas mehr als 3 Monate bis zur Abgabe... so langsam sollte ich auch mal Text schreiben :oops:
</OT>

Verfasst: 12. Juni 2009 22:47
von franzf
Du weißt schon, dass QMessageBox auch nur ein QWidget ist. Damit gibts auch ein show(). Und das macht genau das was ein QWidget::show() auch macht, nur ohne exec() ;)

Ach ja. Denk an die armen Benutzer deiner Software, die bei einem kurzen Gang aufs Klo am Ende zig Fenster zuklicken müssen :P

Wäre nicht schlecht wenn du dir nen kleinen Logger schreibst. Wenn ne neue Meldung ankommt kann der kurz blinken, dass der User weiß dass war los war.

Verfasst: 13. Juni 2009 09:38
von solarix
Würde da evt. auch einfach eine QueuedConnection (von incomming_errormsg_signal zu incomming_errormsg) reichen, anstelle einer DirectConnection?