2012-04-04 50 views
1

我有一个字典,其中的键是我的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)) 

我认为这个问题与内使用lambda函数的for循环和范围的事,但我m不知道如何以其他方式将valueChanged信号的返回值传递到部分创建的插槽中。任何建议,将不胜感激。

+1

'dialChanged'的签名是什么? – 2012-04-04 00:40:18

回答

2

其实,我觉得它确实是有意义的使用部分在这里,和沟拉姆达,而是为了让自己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,并且您需要通过环绕呼叫完全重新设置签名的格式。

+0

太棒了!这是完美的。谢谢! – Bitrex 2012-04-04 01:04:35

+3

@Bitrex:我对PyQt迄今为止的经验是,部分几乎总能解决我的回调需求。我从不使用lambdas作为回调。 – jdi 2012-04-04 01:06:06