创建自定义插槽并标记旧样式

时间:2012-06-27 00:45:39

标签: pyqt4

我正在尝试创建自己的自定义信号,但无论出于何种原因,它都没有进入该功能。我出错的任何想法?

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'

1 个答案:

答案 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)

Old-style Signal and Slot Support

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