[英]PyQt - slots with parameter
例:
我有三個按鈕,所有按鈕幾乎相同。 我只希望所有3個按鈕具有1個插槽功能。
def slotButtons(nr_button):
#common part
if(nr==1):
#for button 1
else if(nr==2):
#for button 2
else if(nr==3):
#for button 3
#common part
所以我需要帶有參數的插槽。
QtCore.QObject.connect(pushButton1, QtCore.SIGNAL("clicked()"), slotButtons(1))
QtCore.QObject.connect(pushButton2, QtCore.SIGNAL("clicked()"), slotButtons(2))
QtCore.QObject.connect(pushButton3, QtCore.SIGNAL("clicked()"), slotButtons(3))
Python(pyQt)可以做些什么嗎?
connect
需要的是任何可調用的 Python對象。 由於Python具有作為一等對象的功能,因此使用包裝函數很容易實現。 對於簡單的情況, lambda
可以:
self.connect(pyuic4Button, SIGNAL("clicked()"),
lambda: self.setPath("pyuic4"))
self.connect(pyrcc4Button, SIGNAL("clicked()"),
lambda: self.setPath("pyrcc4"))
您可以使用QObject::sender()
函數使每個發送者,對象的行為有所不同,有關詳細信息,請參見QObject文檔 。
您甚至可以:
lambda value: self.doStuff(True if value==True else False)
一旦弄清楚了它是如何工作的,它就是一個很棒的工具。
編輯:您也可以跳過所有的ifs / else ...就直接指向...-粗略的例子:
btn_01 = lambda: self.doStuff("C://")
btn_02 = lambda: self.doStuff("D://")
def doStuff(self,dir):
saveFile(dir+"filename.txt")
我不使用PyQt,而是查看QSignalMapper文檔,它應該是相同的。 基本上,它允許您使用參數將來自不同對象的信號映射到插槽。
您可以使用一個成員變量來標識該對象,並執行以下確定的操作。
def slotButtons(btn):
if btn.who_are_you == 1:
# Do some stuff
elif btn.who_are_you == 2:
# Do some stuff
elif btn.who_are_you == 3:
# Do some stuff
# Common part
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.