使用PyQt4,虽然我断开了插槽,但它仍然会触发

时间:2012-02-24 19:14:15

标签: python pyqt4 signals-slots

我想在对象列表中执行一个函数,并存储结果。 我在下面的代码中的问题是,尽管我尝试断开所有信号,但functionC仍以某种方式持续触发。 (断开输出False)

class object(...):
  def init(self):
    ...
    self.emit(SIGNAL('result(bool)', result)
    ...

class classA(...):
  def functionA(self):
    self.results=[]
    self.i=0
    self.object[...]=... # len(self.object)=n
    self.functionB()

  def functionB(self):
    self.connect(self.object[self.i], SIGNAL('result(bool)'), lambda bool: self.functionC(bool))
    self.object[self.i].init()

  def functionC(self, result):
    print self.disconnect(self.object[self.i], SIGNAL('result(bool)', lambda bool: self.functionC(bool)) # outputs False (why cannot I disconnect it?)
    self.i+=1
    self.results.append(result)
    if self.i==len(self.object):
      print "finish"
      self.i=0
      return
    self.functionB()

任何人都能想象出这个问题?感谢

1 个答案:

答案 0 :(得分:3)

我不确定您的代码是否仅仅是一个示例,或者您是否真的在为插槽使用lambda函数。如果您确实使用lambda,原因很可能是因为lambda函数在connect和disconnect之间是完全不同的对象:

>>> fn1 = lambda bool: self.functionC(bool)
>>> fn2 = lambda bool: self.functionC(bool)
>>> print fn1, fn2
<function <lambda> at 0x1004a9320> <function <lambda> at 0x1004a9398>
>>> fn1 == fn2
False
>>> fn1 is fn2
False

如果pyqt正在存储函数引用并查找您指定要断开的函数引用,它将报告它未连接。你想要做的是实际引用一个持久的回调。将lambda存储为成员属性并同时引用同一属性,或将其定义为标准方法或函数。