0

我正在尝试创建自己的自定义信号,但无论出于何种原因,它都没有进入函数。有什么想法我哪里出错了吗?

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'
4

1 回答 1

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)

这种方法不关心你决定传递什么参数。你可以通过任何你想要的东西。

如果要专门控制签名,可以定义内置类型:

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 个参数。

于 2012-06-27T17:50:43.013 回答