【问题标题】:How to retrieve Caller and Callee class for signals(emit, connect) in python?如何在python中检索信号(发射,连接)的调用者和被调用者类?
【发布时间】:2013-10-21 20:35:55
【问题描述】:

我的目标是在程序运行时为每个发出的信号检索调用者和被调用者的类名。使用文件“scenario.py”解释了该问题。所以我们可以看到,对于每个“emit”语句,我可以在运行时通过在“emit”语句上方添加一个 print 语句来打印出 Caller 类。但是另一个被调用者类是不可能的,因为我没有关于被调用者对象的信息以及它将被调用者的函数。 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 类信息?上面的场景是一个示例代码。可能存在发出语句位于不同文件中而连接语句位于应用程序的不同文件中的情况。

【问题讨论】:

    标签: python pyqt runtime


    【解决方案1】:

    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 内,您无法真正知道谁在监听您发出的信号,可能没有或有多个接收器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-11
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      相关资源
      最近更新 更多