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

Alles rund um die Programmierung mit Qt
Antworten
speedy
Beiträge: 52
Registriert: 23. Juli 2008 03:17

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

Beitrag 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
Zuletzt geändert von speedy am 12. Juni 2009 22:36, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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...
speedy
Beiträge: 52
Registriert: 23. Juli 2008 03:17

Beitrag von speedy »

da muss ich mal heute abend schauen was da wo noch passiert.
Hab jetzt leider keine Zeit, will gleich zum Tanzen.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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?
speedy
Beiträge: 52
Registriert: 23. Juli 2008 03:17

Beitrag 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.
speedy
Beiträge: 52
Registriert: 23. Juli 2008 03:17

Beitrag 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.
speedy
Beiträge: 52
Registriert: 23. Juli 2008 03:17

Beitrag 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>
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Würde da evt. auch einfach eine QueuedConnection (von incomming_errormsg_signal zu incomming_errormsg) reichen, anstelle einer DirectConnection?
Antworten