两个不同类别的信号和插槽

时间:2014-01-28 00:05:26

标签: python multithreading qt pyside

我正在学习信号和插槽,我对这种情况感到困惑。

上下文:我在ClassA中有一个方法,需要发出一个信号(从工作线程)到ClassB(在主线程中)。工作线程执行一些重载处理,而主线程更新UI中的进度条。我需要工作线程将信号传递给主线程以更新UI。

我不确定如何在两个不同的类之间传递信号。现在我让第一个类实例化一个信号对象(Communicate),将它连接到第二个类中的方法,然后在准备就绪时发出。这导致了一个段错误,显然我做错了。

我有以下信号类:

class Communicate(QtCore.QObject):

    update_progress = QtCore.Signal()

这是ClassA中的方法,工作线程:

def methodInClassA(self, filename):

    c = Communicate()
    c.update_progress.connect(ClassB.set_progress) 

    print "emitting"
    c.update_progress.emit()

    ...

以下是ClassB中的方法,即更新UI中进度条的方法:

class ClassB(QtGui.QDialog, classB.Ui_Dialog):

    def __init__(self, parent=None):

        super(ClassB, self).__init__(parent)
        self.setupUi(self)


    def set_progress(self):

        print "RECEIVED"    
        sender = self.sender()
        self.progressBar.setValue(100)  

1 个答案:

答案 0 :(得分:2)

您正在将c.update_progress连接到ClassB.set_progress,这是一种未绑定的方法。这在PySide中不起作用,我很确定它在PyQt中也不起作用。你需要有一个ClassB的实例并将c.update_progress连接到它的set progress方法,比如     c.update_progress.connect(i_am_b.set_progress)

i_am_b必须已在其他地方实例化。在调用emit之前,需要注意设置i_am_b和A实例的线程关系;请参阅QObject.moveToThread的文档。