0

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

#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

那么是否可以在运行时检索一般的调用者类信息?上面的场景是一个示例代码。可能存在发出语句位于不同文件中而连接语句位于应用程序的不同文件中的情况。

4

1 回答 1

2

QObjects 有一个方法sender()可以让你从被调用的槽中获取信号的发送者,所以很容易从被调用的方法 ( 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()

从内部afunc你无法真正知道谁在监听你发出的信号,可能没有或有多个接收器。

于 2013-10-14T15:30:58.863 回答