如何在python中检索Caller和Callee类的信号(emit,connect)?

时间:2013-10-14 09:48:26

标签: python pyqt runtime

我的目标是在程序运行时为每个发出的信号检索调用者和被调用者类名。使用文件“scenario.py”解释了该问题。因此,我们可以看到,对于每个“emit”语句,我可以在运行时通过在“emit”语句上方添加print语句来打印出Caller类。但另一方面的callee类是不可能的,因为我没有关于被调用者对象的信息以及它将被调用的函数。 connect语句确实显示了被调用者类,但我需要在运行时检索信息,所以通常无法检索被调用者类?

#Scenario.py
class A (QObject):
        def __init__(self):
            QObject.__init__(self)

        def afunc (self):
            print self.__class__.__name__, "Printing"   <-- Caller class is retrieved
            self.emit(SIGNAL("Printing()"))
Class B:
       def bfunc(self):
            print "Hello World!"

if __name__=="__main__":
    app=QCoreApplication(sys.argv)
    a=A()
    b=B()
    QObject.connect(a,SIGNAL("Printing()"),b.bfunc)
    a.afunc()    
    sys.exit(app.exec_())

Expected OutPut :
A  Printing()  B

那么可以在运行时检索一般的Caller类信息吗?上面的场景是一个示例代码。可能存在emit语句位于不同文件中并且connect语句位于应用程序的不同文件中的情况。

1 个答案:

答案 0 :(得分:2)

QObject有一个方法sender(),允许您从被调用的插槽中获取信号的发送方,因此很容易从被调用的方法中获取发送方({{1} }):

bfunc

from PyQt4.QtCore import * import sys class A (QObject): def __init__(self): QObject.__init__(self) def afunc (self): self.emit(SIGNAL("Printing()")) class B(QObject): def bfunc(self): print self.sender().__class__.__name__ , "Printing()", self.__class__.__name__ print "Hello World!" if __name__ == "__main__": app=QCoreApplication(sys.argv) a=A() b=B() QObject.connect(a,SIGNAL("Printing()"),b.bfunc) a.afunc() app.processEvents() 开始,您无法真正知道谁在听你正在发出的信号,可能没有或有多个接收器。