2015-10-05 9 views
2

Я пытаюсь подклассифицировать общий класс данных для выполнения некоторых дополнительных операций над данными, вычисленными родителем. Я хотел бы повторно использовать сигнал dataReady в подклассе. Проблема в том, что сигнал все еще испускается из родительского элемента и запускает подключенный слот (ы) до завершения дополнительных вычислений.Переопределение сигналов PyQt в дочернем классе

Возможно ли переопределить/подавить сигналы, излучаемые родительским классом, или мне просто нужно выбрать другое имя сигнала?

Вот упрощенный пример моих классов:

class Generic(QtCore.QObject): 
    dataReady = pyqtSignal() 

    def __init__(self, parent=None): 
     super(Generic, self).__init__(parent) 

    def initData(self): 
     # Perform computations 
     ... 

     self.dataReady.emit() 

class MoreSpecific(Generic): 
    dataReady = pyqtSignal() 

    def __init__(self, parent=None): 
     super(MoreSpecific, self).__init__(parent) 

    def initData(self): 
     super(MoreSpecific, self).initData() 

     # Further computations 
     ... 

     self.dataReady.emit() 

ответ

2

Вы можете использовать blockSignals:

def initData(self): 
    self.blockSignals(True) 
    super(MoreSpecific, self).initData() 
    self.blockSignals(False) 
+0

Спасибо, это отвечает на мой вопрос. Однако, похоже, этот метод не будет распространяться на дальнейшие уровни наследования – user3419537

+0

@ user3419537. Да. Он будет блокировать * все * сигналы, независимо от наследования. Однако 'super' не предназначен для вызова * определенных * классов в иерархии наследования. Для этого вам следует обойти порядок вычисления расчетного метода и напрямую ссылаться на класс (например, «BaseClass.initData (self)»). – ekhumoro

+0

Я понимаю, что проблема заключается в том, что вызов также разблокирует все сигналы независимо от наследования, поэтому, если у меня есть ребенок, который использует этот метод, а родительский конструктор вызывает «blockSignals (False)» и испускает сигнал, то это отрицает эффект вызова 'blockSignals (True)' в конструкторе дочернего элемента. – user3419537

1

Я бы просто перестроить классы немного.

class Generic(QtCore.QObject): 
    dataReady = pyqtSignal() 

    def __init__(self, parent=None): 
     super(Generic, self).__init__(parent) 

    def initData(self): 
     self.computations() 
     self.dataReady.emit() 

    def computations(self): 
     # put your computations in a method 
     ... 

class MoreSpecific(Generic): 

    def __init__(self, parent=None): 
     super(MoreSpecific, self).__init__(parent) 

    def computations(self): 
     super(MoreSpecific, self).computations() 
     # further computations 

Теперь ваш initData метод, который должен сделать некоторые вычисления, а затем послать сигнал, не должен меняться и ваш MoreSpecific класс будет посылать только сигнал один раз.

+0

Я думаю, что в моем случае вы правы - перестройка классов, вероятно, является окончательным решением. Я принял ответ от @ekhumoro, хотя, поскольку он отвечает на вопрос, который я задал. – user3419537

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

  • Нет связанных вопросов^_^