使用partial为PyQt中具有返回值的信号创建槽

时间:2012-04-04 00:38:57

标签: python pyqt

我有一个字典,其键是我的PyQT界面中所有拨号的名称。与这些键关联的值是与每个拨号相关联的特定数值,需要传递给处理函数(以确定移动了哪个拨号),以及该拨号的新值。

我使用functools.partial为每个数值创建一个处理函数的不同实例,但是“valueChanged”信号返回一个整数,我不知道如何将它传递给部分函数好。以下似乎不起作用,因为dialChanged函数最终永远不会被调用:

for dial, cc, in dialDict.iteritems():
    getattr(self.ui, dial).setRange(0,127)
    getattr(self.ui, dial).valueChanged.connect(
        lambda value: partial(self.windowHandler.dialChanged, 
                              mainWindowInstance=self, 
                              cc=cc, 
                              value=value))

我认为问题与在for循环和范围内使用lambda函数有关,但我不知道如何将valueChanged信号的返回值传递给partial创建的插槽。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:2)

我实际上认为在这里使用partial是有意义的,并抛弃lambda,但是要让你的dialChanged处理程序具有回调友好签名:

# where ever this is defined
def dialChanged(value, mainWindowInstance=None, cc=None):
    pass

cbk = partial(
    self.windowHandler.dialChanged, 
    mainWindowInstance=self, 
    cc=cc)

.valueChanged.connect(cbk)

将使用值arg调用插槽,因此这应该与我认为的签名对齐。只有在您无法控制dialChanged插槽功能并且需要通过绕过呼叫完全重新格式化签名时,才需要lambda。