Как отлаживать соединения сигналов / слотов pyqt, возможно, проблема с многопоточностью - PullRequest
2 голосов
/ 12 марта 2012

У меня есть следующий пример кода моей проблемы. Запустив это, я ожидал бы, что (если вы введете что-то в lineedit), слот A.updateValue будет вызван дважды и, таким образом, отобразятся «a.updatevalue named» и «a2.updatevalue с именем«
Однако он вызывается только один раз, а именно для объекта self.a2, а не для объекта self.a, последний, который отправляется из рабочего потока в поток GUI. Как я могу это исправить, чтобы этот фрагмент кода также запускал слот для объекта self.a?

Спасибо, David

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_())

1 Ответ

0 голосов
/ 12 марта 2012

Определите 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)
...