2012-08-06 41 views
1

我在PyQt4中很难连接信号和方法。 我可以用对象B的方法连接对象A的绑定信号, ,但我无法将对象A的绑定信号与自己的方法 (进行连接的对象)连接。
我是什么做错了?请看下图:在PyQt4中连接信号和自己的方法

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 


class FooA(QObject): 
    trigger=pyqtSignal(str) 

    def receive_trigger(self,a): 
     print'triggered in FooA, string',a 

class MainObj(QObject): 
    def __init__(self): 
     self.a1=FooA() 
     self.a2=FooA() 
     #I can connect signals and methods of separate objects: 
     self.a1.trigger.connect(self.a2.receive_trigger) 
     self.a1.trigger.emit('hi') 
     #... but I can't connect a signal with a method of self 
     self.a1.trigger.connect(self.receive_trigger) 
     self.a1.trigger.emit('hi') 
    def receive_trigger(self,a): 
     print 'triggered in MainObj' 

执行为: MainObj()

在FooA触发,串喜 在FooA触发,串喜

我期望看到一个额外的行, >在MainObj中触发

在此先感谢。 Bill

+0

按预期为我工作。确定您发布的代码与您尝试运行的代码相同吗? – ekhumoro 2012-08-06 16:47:13

+0

确认的作品也适合我。 – jdi 2012-08-06 20:48:20

回答

2

正如您已经知道的那样,信号必须属于QObject s,但由于您未调用QObject的构造函数,因此发生此问题。 FooA不会覆盖构造函数,因此将调用默认的构造函数,并且信号按预期工作。然而,在MainObj中,你不会调用超类'(QObject)的构造函数,所以信号将不起作用。要解决,要么把:

QObject.__init__(self) 

super(QObject, self).__init__() 

(根据您的惯例)在MainObj小号构造器的顶部,然后将信号将正常工作。

+0

你说得没有调用超类init,但是你真的能够重现OP问题吗?什么版本的PyQt4不能在此下工作? – jdi 2012-08-06 20:49:55