2011-03-19 43 views
0

讓假設你有一個類如何通過使用預定義的信號參數的函數在PyQt的

self.Option1 = QRadioButton() 
self.Option2 = QRadioButton() 
self.Option2 = QRadioButton() 

內3個QRadioButtons實例(爲簡便起見,我沒有寫的整個腳本) ,你想使用它們,當用戶點擊它來執行特定的功能,讓你做

self.connect(self.Option1,SIGNAL("clicked()"), self.myFunction) 
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction) 
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction) 

如何傳遞參數給myFunction所以它知道QRadioButtons的至極被點擊用戶?所以我可以做的東西一樣

def myFunction(choice): 
    if choice == Option1: 
     do something 
    if choice == Option2: 
     do something 

現在我有3個功能,每次每個連接這樣的

self.connect(self.Option1,SIGNAL("clicked()"), self.myFunction1) 
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction2) 
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction2) 

而且這種方法工作得很好,但你可以看到代碼是如何迅速成長因爲每添加一個窗口小部件,我都必須編寫至少一個新函數或修改現有窗口,它將成爲維護噩夢(更不用說它看起來很醜並且防止代碼重用)。

谷歌構成快速訪問讓我這個:

self.label = QLabel(" ") 

    self.connect(self, SIGNAL("didSomething"), 
       self.update_label) 
    self.do_something() 

def do_something(self): 
    self.emit(SIGNAL("didSomething"), "important", "information") 

def update_label(self, value1, value2): 
    self.label.setText(value1 + " " + value2) 

(再次我沒有包括整個腳本,但你可以檢查出來here) 他所做的是創造出了一個方法來定義一個定製的發射器是當發射參數發送,然後使用

self.do_something() 

手動因此自然而然激活它,連接函數挑選這個emition和傳遞函數的自變量update_label,部分實現了我想做的事情。但他正在手動做,是否有辦法自動「截取」標準信號(例如QRadioButtons發出的clicked()信號)並向其添加參數,以便它們傳遞給函數以與它們一起工作?

在此先感謝

回答

2

這個問題的解決方案的Qt是QSignalMapper我想。但之前我有同樣的問題,並且我發現使用「部分」功能更簡單。使用它這樣的:

from functools import partial 

self.connect(self.Option1,SIGNAL("clicked()"), partial(self.myFunction, 1)) 
self.connect(self.Option2,SIGNAL("clicked()"), partial(self.myFunction, 2)) 
self.connect(self.Option3,SIGNAL("clicked()"), partial(self.myFunction, 3)) 

欲瞭解更多信息:http://docs.python.org/library/functools.html#functools.partial

+0

這是絕對簡單,使用QSignalMapper,我想最終我會使用它,但現在您的解決方案的效果最好,謝謝。 – 2011-03-19 19:47:58

相關問題