2014-01-28 2 views
1

Я изучаю сигналы и слоты, и я смущен этой ситуацией.Сигналы и слоты в двух разных классах

Контекст: У меня есть метод в ClassA, который должен излучать сигнал (из рабочего потока) в ClassB (в основном потоке). Рабочий поток выполняет некоторую обработку с большой нагрузкой, а основной поток обновляет индикатор выполнения в пользовательском интерфейсе. Мне нужен рабочий поток для передачи сигналов в основной поток для обновления пользовательского интерфейса.

Я не уверен, как передавать сигнал между двумя разными классами. Прямо сейчас у меня есть первый класс, создающий объект сигнала (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, тот обновляя индикатор прогресса в Пользовательский интерфейс:

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 перед вызовом emit; см. документы для QObject.moveToThread.

+0

У меня есть основной поток, создающий экземпляр класса B, и у меня есть метод, который обновляет значение прогресса для этого объекта класса. Я подключил сигнал к этому методу. Это фиксировало это. Спасибо! – Diana

Смежные вопросы