Seite 1 von 1

Neue Dialoge dynamisch erstellen

Verfasst: 1. März 2009 18:13
von D.Cent
Ich arbeite gerade an einem IRC-Projekt und habe folgendes Problem: Sobald ein Spieler eine Nachricht bekommt, soll sich ein Dialog zum Chatten öffnen. Ist dieser schon offen, wird die neue Nachricht in den Dialog geschrieben. Das kann daran erkannt werden, ob der Dialog sich in meiner Liste befindet.

Der Dialog heißt "pm" und wird so erstellt:

Code: Alles auswählen

void ircclient::event_privmsg (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count)
{
	dump_event (session, event, origin, params, count); //Event dumper

	QString text(params[1]); // kopiere die Nachricht

	//suche nach einen zugehörigen Dialog (falls vorhanden)
	for(list<pm*>::iterator itr = opened_pms.begin(); itr != opened_pms.end(); itr++)
	{
		if(!strcmp((*itr)->person.toAscii().data(), origin))
		{
			//vorhanden, also nur einfügen
			(*itr)->tb_messages.insertPlainText(text);
			return;
		}
	}

	//nicht vorhanden - neuer Dialog wird erstellt
	pm dlg(origin); // Initialisierung
	dlg.show(); // Dialog anzeigen
		
	opened_pms.push_back(&dlg); //Dialog in die Liste eintragen
		
	dlg.tb_messages.insertPlainText(text); //Text in neuen Dialog einfügen
}
"pm" erbt von QMainWindow. Der Fehler: es öffnet sich einfach kein Dialog, und in der Konsole bekomme ich diese Fehler:

Code: Alles auswählen

QPixmap: It is not safe to use pixmaps outside the GUI thread
QPixmap: It is not safe to use pixmaps outside the GUI thread
QPixmap: It is not safe to use pixmaps outside the GUI thread
QPixmap: It is not safe to use pixmaps outside the GUI thread
QObject::installEventFilter(): Cannot filter events for objects in a different thread.
QObject::installEventFilter(): Cannot filter events for objects in a different thread.
QObject::installEventFilter(): Cannot filter events for objects in a different thread.
Danach spinnt das hauptsächliche Fenster komplett.
Wie kann ich das richtig hinbiegen?

Gesamter Source (steht unter der GPL3): http://intelcentino.in.funpic.de/upload/irc.zip (wird aber nicht kompilierbar sein, weil ich eigene Bibliotheken verwende)[/code]

Verfasst: 2. März 2009 09:37
von VuuRWerK
1. wenn "pm" ein Dialog ist sollte er auch von QDialog erben
2. QString implementiert einen Vergleichsoparator der auch mit const char* operiert, daher reicht:

Code: Alles auswählen

(*itr)->person == origin
3. C++ Grundlagen: Lifecycle von Objekten
3.1. ggf. den Dialog static initialisieren und dann nur noch text hinzufügen.
4. insertPlainText ist ein Slot!
5. Die Fehlermeldungen stammen soweit nicht aus Deinem Stückchen Code hab auch keine Zeit mir jetzt Deinen ganzen Code anzuschauen und zu suchen woran es liegt. Die Fehlermeldungen sind denk ich eindeutig und sollten Dir helfen die Fehler zu beheben.

Ansonsten dazu hier was zum lesen: Gut Schuß
VuuRWerK ;)

Verfasst: 2. März 2009 17:26
von D.Cent
Habe jetzt entdeckt, dass es daran liegt, dass die Funktion von meinem IRC-event-handler aufgerufen wird.

Werde mich dann wohl mit Signalen befassen müssen.
Danke für Deine Hilfe!