2015-06-20 91 views
0

你好需要一些幫助當我收到服務器發送的某種類型的信息時,我試圖顯示一個窗口彈出窗口。問題是從服務器接收數據的方法是一個線程,所以我在修改MainWindow時遇到了問題,這就是爲什麼我試圖從線程發送信號到類User中的另一個方法(請參閱下面的代碼),所以我不修改線程的窗口。我得到以下錯誤:從線程發送信號時出錯

TypeError: User cannot be converted to PyQt4.QtCore.QObject in this context 

我不知道這是不是解決問題的正確方法,所以如果有一個更好的辦法,我會感謝你的幫助,在這裏不用代碼:

class User: 
    signal1 = QtCore.pyqtSignal() 

    def __init__(self, usuario): 
     self.usuario = usuario 
     self.host = '127.0.0.1' 
     self.port = 3490 
     self.user = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Socket cliente 
     try:     
      self.thread_wait_server = threading.Thread(target=self.wait_server) 
      self.thread_wait_server.start()    

     except socket.error: 
      print("No fue posible realizar la conexión") 
      sys.exit() 
     self.initUI() 

    def initUI(self): 
     app = QtGui.QApplication(sys.argv) 
     self.login = interfaz.Loggin() 
     self.login.show() 
     self.signal1.connect(self.showMain) 
     self.login.crear.trigger.connect(self.signal) 
     self.login.trigger1.connect(self.signal2) 
     app.exec_() 

    def signal(self): 
     info = self.login.crear.userPassword() 
     info1 = pickle.dumps(info) 
     self.user.sendall(info1) 

    def signal2(self): 
     info2 = self.login.comprobar() 
     info3 = pickle.dumps(info2) 
     self.user.sendall(info3) 
     print('sendall') 

    def wait_server(self): 
     self.conectar() 

    def conectar(self): 
     self.user.connect((self.host, self.port)) 
     self.listener = threading.Thread(target=self.listen, args=()) 
     self.listener.Daemon = True 
     self.listener.start() 

    def listen(self): 
     while True: 

      data = self.user.recv(1024) 
      print('received') 
      print(data) 
      if data: 
       info = pickle.loads(data) 
       if info == 'usuario_valido': 
        self.signal1.emit() 
        print('mainshow') 
        #self.login.exit() 

    def showMain(self): 
     self.login.main.show() 

不介意它們只是將東西發送到服務器的函數信號問題是當服務器發回我的用戶應該接收的信息並在這種情況下執行某些操作時偵聽的方法打開一個窗口。 (我的部件洛()和一個我想要顯示設置爲類洛(的屬性)和其所謂的主。

感謝

回答

2

如果你想它的類User必須從QObject繼承因此類定義的第一行應爲class User(QtCore.QObject):

+0

另外不要忘記在User類的init方法後面添加「__super(User,self).__ init __()__」: – Logic1