Ver Mensaje Individual
  #3 (permalink)  
Antiguo 26/08/2012, 12:48
samuelb1311
 
Fecha de Ingreso: diciembre-2011
Mensajes: 26
Antigüedad: 12 años, 4 meses
Puntos: 5
De acuerdo Respuesta: Problema con Threads y QT

Bueno ya pude resolverlo, la manera de hacerlo en QT es usando el sistema de SIGNAL y SLOTS, emitiendo una Señal en el thread cuando llega el mensaje, para que el parent thread lo gestione, aqui va el codigo del client.py por si a alguien le sirve:

Código Python:
Ver original
  1. from PySide import QtGui, QtCore
  2. import socket, thread, sys
  3.  
  4. socket_cliente = socket.socket()
  5. socket_cliente.connect(('', 9090))
  6.  
  7. class Window(QtGui.QMainWindow):
  8.     def __init__(self):
  9.         super(Window, self).__init__()
  10.         self.socket()
  11.  
  12.         self.browser = QtGui.QTextBrowser()
  13.         self.browser.backwardAvailable
  14.  
  15.         self.textEdit = QtGui.QTextEdit()
  16.         self.textEdit.setMaximumSize(QtCore.QSize(400, 60))
  17.  
  18.         self.connect(self.browser, QtCore.SIGNAL("returnPressed()"), self.enviar_mensaje)
  19.         self.connect(self, QtCore.SIGNAL("agregarMensaje(QString)"), self.imprime)
  20.  
  21.         enviarB = QtGui.QPushButton("Enviar")
  22.         enviarB.setMaximumSize(QtCore.QSize(400, 60))
  23.         enviarB.clicked.connect(self.enviar_mensaje)
  24.  
  25.         layoutINlayout = QtGui.QHBoxLayout()
  26.         layoutINlayout.addWidget(self.textEdit)
  27.         layoutINlayout.addWidget(enviarB)
  28.  
  29.         widget = QtGui.QWidget()
  30.         self.setCentralWidget(widget)
  31.  
  32.         self.layout = QtGui.QVBoxLayout()
  33.         self.layout.addWidget(self.browser)
  34.  
  35.         mainWindow = QtGui.QVBoxLayout()
  36.         mainWindow.addLayout(self.layout)
  37.         mainWindow.addLayout(layoutINlayout)
  38.  
  39.         widget.setLayout(mainWindow)
  40.         self.setWindowFlags(QtCore.Qt.WindowTitleHint)
  41.  
  42.     def imprime(self, mensaje):
  43.         self.add_mensaje(mensaje)
  44.  
  45.     def enviar_mensaje(self):
  46.         mensaje = self.textEdit.toPlainText()
  47.         socket_cliente.send(mensaje)
  48.  
  49.     def add_mensaje(self, mensaje):
  50.         self.browser.setText(mensaje)
  51.  
  52.     def socket(self):
  53.         def loop():
  54.             while True:
  55.                 print "Esperando mensajes"
  56.                 mensaje = socket_cliente.recv(1000)
  57.                 if mensaje:
  58.                     self.emit(QtCore.SIGNAL("agregarMensaje(QString)"), mensaje)
  59.  
  60.         thread.start_new_thread(loop, ())
  61.  
  62. app = QtGui.QApplication(sys.argv)
  63. w = Window()
  64. w.show()
  65. app.exec_()