thread notwendig bei multichat?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
usingKarmicKoala
User
Beiträge: 27
Registriert: Samstag 28. November 2009, 15:58

In meinem "Programm" können sich beliebig viele clients bei einem server anmelden.
Danach kann man einsehen wer sich bereits angemeldet hat und sich so Jemanden aussuchen, den man anschreiben will (wie das bei normalen Chat-Programmen eben der Fall ist)
Mein Problem entsteht nun, wenn ein client eine Nachricht von einem anderen bekommt ohne, dass vorher schon ein Chatfenster zu dem Absender geöffnet wurde.
Denn dann versuche ich ein Fenster zu öffnen und die bekommene Nachricht darein zu schreiben. Leider ist nach dem öffnen des Fenster im Quelltext Schluss ( ab dem fenster.exec_() eben ). Meine Frage ist nun, ob es eine Möglichkeit gibt ohne Threads das ganze zu lösen oder ob ich darauf zurückgreifen muss.

hier mal etwas dazugehöriger Quelltext:

Code: Alles auswählen

		#ist schon ein fenster zum absender geöffnet?
			if sender in self.openWindows.keys():
				#ins chatfenster schreiben
				self.openWindows[sender].createLabel(text)
			#falls nicht und in diesem zweig entsteht das problem
			else:
				#absender der nachricht als chatpartner erkennen
				self.receiver = sender
				#chatfenster öffnen
                                self.startChat()                           #hier ist natürlich ende durch das fenster.exec_() in startChat
				#text ins chatfenster scheiben
				self.openWindows[sender].createLabel(text)
				#default-Receiver wiederherstellen
				self.getReceiver()
startChat sieht dann so aus:

Code: Alles auswählen

	def startChat(self):
		#wenn für den mpfänger schon ein chatfenster offen ist
		if self.receiver in self.openWindows.keys():
			#dem user melden dass schon ein fenster offen ist
			msgBox = QtGui.QMessageBox(self)
			msgBox.setText("Sie haben schon ein Chatfenster mit diesem Empfänger geöffnet")
			msgBox.exec_()
		else:
			fenster = chatdialog(self)
			#den receiver merken um nochmaliges fensteröffnen zu unterbinden
			self.openWindows[self.receiver] = fenster
			#fenster ausführen
			fenster.exec_()
lunar

Lies die Dokumentation zu .exec_() inklusive der Links.

Im Allgemeinen ist ein QDialog im Übrigen auch nicht der richtige Typ für ein Fenster, welches länger geöffnet ist (was bei einem Chat ja normalerweise der Fall ist).
usingKarmicKoala
User
Beiträge: 27
Registriert: Samstag 28. November 2009, 15:58

danke.. mit open() hat es jetzt geklappt..
was spricht denn prinzipiell dagegen mit dialogs zu arbeiten? sollte ich besser mainwindows nehmen?
lunar

Dialoge sind für Fragen an den Nutzer bzw. für einmalige Eingaben gedacht und nicht für länger anhaltende Interaktion. Dementsprechend besitzen Dialoge eine andere Fensterklasse als QWidget oder QMainWindow, und werden unter Umständen von der Fensterverwaltung anders behandelt.

Unter Windows können Dialoge meist nicht vergrößert oder verkleinert werden, unter X11 kann die Fensterverwaltung mit Dialogen alles mögliche anstellen, was sie mit normalen Fenstern nicht tun würde (z.B. ohne Titelleiste anzeigen, das Vaterfenster abdunkeln, usw.).
Antworten