从线程发送信号时出错

时间:2015-06-20 16:27:08

标签: python multithreading pyqt signals

你需要一些帮助我试图在收到服务器发送的某种类型的信息时显示一个Window弹出窗口。问题是从服务器接收数据的方法是一个线程,所以我在从一个线程修改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()

不介意功能信号他们只是向服务器发送问题是问题是当服务器发回我的用户应该收到的信息并在这种情况下做一些事情时打开一个窗口。 (我的小部件是Loggin(),我想要显示的那个被设​​置为类Loggin()的属性,并且它被称为main。

由于

1 个答案:

答案 0 :(得分:2)

如果您希望它包含信号,则User类必须从QObject继承。因此,类定义的第一行应为class User(QtCore.QObject):