2012-03-12 40 views
2

我有我的问题的以下一段代码示例。运行这个,我期望(如果你在lineedit中输入的东西)A.updateValue插槽将被调用两次,从而显示'a.updatevalue called'和'a2.updatevalue called'
但是,它只被调用一次,即self.a2对象,而不是self.a对象,后者从工作线程发送到GUI线程。我该如何解决这个问题,以便这段代码也触发self.a对象的插槽?如何调试pyqt信号/插槽连接,可能是线程问题

谢谢 大卫

import os, sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class A(QObject): 
    def __init__(self, name): 
     QObject.__init__(self) 
     self.name = name 
    def updateValue(self, value): 
     print(self.name + ".updatevalue called") 

class workerthread(QThread): 
    def __init__(self, parent=None): 
     QThread.__init__(self, parent) 
    def run(self): 
     a = A('a') 
     QObject.emit(self, SIGNAL("mySignal"), a) 

class Main(QMainWindow): 
    def __init__(self): 
     QMainWindow.__init__(self) 
     self.centralwidget = QWidget(self) 
     self.hbox = QHBoxLayout() 
     self.centralwidget.setLayout(self.hbox) 

    def update(self, a): 
     self.a = a 
     edit = QLineEdit("", self) 
     self.hbox.addWidget(edit) 
     edit.textChanged.connect(self.a.updateValue) 
     self.a2 = A('a2') 
     edit.textChanged.connect(self.a2.updateValue) 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    gui = Main() 
    worker = workerthread() 
    worker.connect(worker, SIGNAL('mySignal'), gui.update) 
    worker.start() 
    gui.show() 
    sys.exit(app.exec_()) 

回答

0

定义a在初始化workerThread

class workerthread(QThread): 
    def __init__(self, parent=None): 
     QThread.__init__(self, parent) 
     self.a = A('a') 
    def run(self): 
     QObject.emit(self, SIGNAL("mySignal"), self.a) 
+0

你好,谢谢你的反应。但是,在我的生产代码中,有多个A对象,并且我只在运行时知道将创建多少个A,因此在创建workerThread时定义所有A不是一种选择。任何想法如何解决这个问题? – 2012-03-12 11:29:27

+0

我认为问题在于'self.a.updateValue'SLOT与'textChanged'SIGNAL不在同一个线程中。尝试在发出'mySignal'之前添加它:'a.moveToThread(QApplication.instance()。thread())' – 2012-03-12 18:11:23