2014-01-28 52 views
1

我正在學習信號和插槽,我很困惑這種情況。信號和插槽在兩個不同的類

上下文:我有一個方法在ClassA誰需要發出一個信號(從工作線程)到ClassB(在主線程)。工作線程執行一些繁重的處理,而主線程更新UI中的進度條。我需要工作線程將信號傳遞給主線程以更新UI。

我不知道如何讓信號在兩個不同的類之間傳遞。現在我讓第一個類實例化一個信號對象(Communicate),將它連接到第二個類中的方法,然後在準備就緒時發出。這是導致seg故障,很明顯我做錯了什麼。

我有以下信號類:

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) 

回答

2

您正在將c.update_progress連接到ClassB.set_progress,一個未綁定 方法。這在PySide中不起作用,我很確定它不會在PyQt中工作。你需要有ClassB的一個實例連接c.update_progress到其設置方法的進步,像 c.update_progress.connect(i_am_b.set_progress)

i_am_b必須已在其他地方實例化。在調用發射之前,您需要小心地設置i_am_b和A的實例的線程親和性;請參閱QObject.moveToThread的文檔。

+0

我正在讓主線程創建一個ClassB的實例,並且我有一個方法來更新該類對象的進度值。我將這個信號連接到這個方法。這固定了它。謝謝! – Diana