2013-01-31 119 views
0

內使用pyside小蟒蛇2.7的項目,我想找出一個信號源內部QT綁定模塊。因此,在一個插槽內,我想要一些方法來詢問該插槽實際上被觸發的信號。的Python/PySide/QT:找出一個信號名稱的插槽

我想通了,這給了我實際發送對象的乾淨調試符號:

sigItem = "<anonymous>" if not self.sender() else \ 
      re.search('<(.+) object at .+>', repr(self.sender()), 0).group(1) 

但所有我發現到現在爲止,以確定導致此槽被稱爲是顯然的信號的實際信號指數主叫對象中:

sigIndex = self.senderSignalIndex() 

所以,我怎樣才能找出實際信號

+0

AFAIK,QT信號,就像其他C++方法或變量一樣,不存儲其名稱。因此,沒有辦法知道,你可以得到一個信號的參考,但不是它的名字。 – Dikei

+0

@Dikei嗯,不錯,但......如果非要發射對象的引用,提高了信號的指標 - 仍然沒有辦法告訴索引指示的方法的名稱?如果像數字索引這樣的東西存在,我希望索引在某個列表或字典中有效...... – arkascha

回答

3

你可以使用索引來得到一個QMetaMethod,但沒有更多。顯然,Qt不希望你知道更多。

from PyQt4 import QtCore 

senderSignalId = None 

class Sender(QtCore.QObject): 

    signal1 = QtCore.pyqtSignal() 
    signal2 = QtCore.pyqtSignal() 

class Receiver(QtCore.QObject): 

    @QtCore.pyqtSlot() 
    def slot(self): 
     global senderSignalId 
     senderSignalId = self.senderSignalIndex() 

sender = Sender() 
receiver = Receiver() 
sender.signal1.connect(receiver.slot) 
sender.signal2.connect(receiver.slot) 

sender.signal1.emit() 
print sender.metaObject().method(senderSignalId).signature() // signal1() 

sender.signal2.emit() 
print sender.metaObject().method(senderSignalId).signature() // signal2()