2012-06-13 70 views
0

我有兩個按鈕,用戶可以點擊它們並打開一個FileDiagloag來選擇一個文件。我需要用戶選擇兩個文件,但我想要一個函數來處理這兩個按鈕調用。所以在我的初始化我:將兩個按鈕連接到相同的回調函數兩個參數

QtCore.QObject.connect(self.ui.Button_SelectJoinFiles_1, QtCore.SIGNAL('clicked()'), self.SelectLogFileToJoin(1)) 
QtCore.QObject.connect(self.ui.Button_SelectJoinFiles_2, QtCore.SIGNAL('clicked()'), self.SelectLogFileToJoin(2)) 

,功能基本上是一樣的東西:

def SelectLogFileToJoin(self, ButtonNum): 
     if(ButtonNum==1): 
     ...... 
     if(ButtonNum==2) 
     ..... 

但是,因爲當我啓動該程序通過它給我一個文件來啓動這不起作用選擇對話框。

有人可以告訴我如何處理傳遞參數到回調函數嗎?

回答

3

這裏的問題是你傳遞函數返回的值,而不是函數本身。要做你想做的事,你需要使用functools.partial()來創建一個帶有預填充參數的新函數:

from functools import partial 

... 

QtCore.QObject.connect(..., partial(self.SelectLogFileToJoin, 1)) 
+2

'partial'在這種情況下是矯枉過正的。關閉將是相當不錯:)'連接(...,lambda:self.SelectLogFileToJoin(1))' – astynax

+0

@astynax矯枉過正?使用拉姆達是一種不太明確的重新發明輪子的方式,以完成部分設計要做的事情。 –

+1

您正在推薦部分應用帶有一個參數的函數。 :)'partial'對於許多(關鍵字)參數部分應用函數很有用。它的效率明顯低於lambda。 lambda函數是回調的好選擇。而我的lambda-closure看起來很乾淨(恕我直言)。 – astynax

相關問題