2010-10-08 3 views
17

Как подключить pyqtSignal между двумя разными объектами (классами)? Я имею в виду лучшую практику.Как подключить pyqtSignal между классами в PyQT

Посмотрите, что я сделал для достижения цели: Thermometer класса уведомляется, когда Pot повышает его температуру:

from PyQt4 import QtCore 

class Pot(QtCore.QObject): 
    temperatureRaisedSignal = QtCore.pyqtSignal() 

    def __init__(self, parent=None): 
     super(Pot, self).__init__(parent) 
     self.temperature = 1 
    def Boil(self): 
     self.temperature += 1 
     self.temperatureRaisedSignal.emit() 
    def RegisterSignal(self, obj): 
     self.temperatureRaisedSignal.connect(obj) 

class Thermometer(): 
    def __init__(self, pot): 
     self.pot = pot 
     self.pot.RegisterSignal(self.temperatureWarning) 
    def StartMeasure(self): 
     self.pot.Boil() 
    def temperatureWarning(self): 
     print("Too high temperature!") 

if __name__ == '__main__': 
    pot = Pot() 
    th = Thermometer(pot) 
    th.StartMeasure() 

Или есть проще/лучше способ сделать это?

Я также настаиваю (если возможно) на использовании сигналов «нового» стиля PyQt.

ответ

21
from PyQt4 import QtCore 

class Pot(QtCore.QObject): 

    temperatureRaisedSignal = QtCore.pyqtSignal() 

    def __init__(self, parent=None): 
     QtCore.QObject.__init__(self) 
     self.temperature = 1 

    def Boil(self): 
     self.temperatureRaisedSignal.emit() 
     self.temperature += 1 

class Thermometer(): 
    def __init__(self, pot): 
     self.pot = pot 
     self.pot.temperatureRaisedSignal.connect(self.temperatureWarning) 

    def StartMeasure(self): 
     self.pot.Boil() 

    def temperatureWarning(self): 
     print("Too high temperature!") 

if __name__ == '__main__': 
    pot = Pot() 
    th = Thermometer(pot) 
    th.StartMeasure() 

Это, как я бы сделал это в соответствии с Документами:
http://www.riverbankcomputing.com/static/Docs/PyQt4/html/new_style_signals_slots.html

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