问题在于您为自定义信号创建签名的方式。有几种方法可以让你做到这一点,但你现在拥有它的方式不是其中之一。
定义连接时,您的操作方式应该会导致引发错误:
# 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)
这种方法不关心你决定传递什么参数。你可以通过任何你想要的东西。
如果要专门控制签名,可以定义内置类型:
self.connect(self, QtCore.SIGNAL('dagEvent(int,str,int)'), self.OnDagEvent)
...
self.emit(QtCore.SIGNAL('dagEvent(int,str,int)'), i1, s2, i3)
如果你没有在发射中使用正确的签名,它将不会被调用,并且发射时传递错误的类型会引发错误。
现在,如果您想在某种程度上定义一个签名,但不将其限制为任何基本类型,并允许任何 python 对象,您可以这样做:
self.connect(self, QtCore.SIGNAL('dagEvent(PyQt_PyObject)'), self.OnDagEvent)
...
self.emit(QtCore.SIGNAL('dagEvent(PyQt_PyObject)'), foo)
这将允许传递任何单个 python 对象,但特别说明它需要 1 个参数。