2012-04-04 47 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