我正在尝试创建自己的自定义信号,但无论出于何种原因,它都没有进入该功能。我出错的任何想法?
def __init__(self):
...
self.connect( self, QtCore.SIGNAL( 'dagEvent(type, *args)' ), self.OnDagEvent)
def someFunc(self, ...):
...
self.emit(QtCore.SIGNAL('dagEvent()'), type, *args)
def OnDagEvent( self, eventType, eventData ):
print 'Test'
答案 0 :(得分:0)
问题在于您为自定义信号创建签名的方式。有几种方法可以让你这样做,但你现在的方式不是其中之一。
定义连接时,执行此操作的方式应该是引发错误:
# not a valid type of signature
QtCore.SIGNAL( 'dagEvent(type, *args)' )
即使允许创建它,当你稍后发出时,你也没有引用相同的签名:
# if it were even allowed, would have to be: dagEvent(type, *args)
self.emit(QtCore.SIGNAL('dagEvent()'), type, *args)
从PyQt创建自定义信号的最简单方法是仅使用可调用名称:
self.connect(self, QtCore.SIGNAL('dagEvent'), self.OnDagEvent)
...
# "type" is a builtin. I renamed it to type_
self.emit(QtCore.SIGNAL('dagEvent'), type_, *args)
这种方法并不关心你决定传递什么args。你可以传递任何你想要的东西。
如果要专门控制签名,可以定义内置类型:
self.connect(self, QtCore.SIGNAL('dagEvent(int,str,int)'), self.OnDagEvent)
...
self.emit(QtCore.SIGNAL('dagEvent(int,str,int)'), i1, s2, i3)
如果你没有在emit中使用正确的签名,它将不会被调用,并且在发出时传递错误的类型将引发错误。
现在,如果你想稍微定义一个签名,但不要将它限制为任何基本类型,并允许任何python对象,你可以这样做:
self.connect(self, QtCore.SIGNAL('dagEvent(PyQt_PyObject)'), self.OnDagEvent)
...
self.emit(QtCore.SIGNAL('dagEvent(PyQt_PyObject)'), foo)
这将允许传递任何单个python对象,但具体说它需要1个参数。