2015-10-05 58 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'不是用来在继承层次结构中调用* specific *类的。为此,您应该绕过计算的方法解析顺序并直接引用类(例如'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