示例:
我有三个按钮,几乎都是一样的。 我希望所有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)可以做些什么吗?
答案 0 :(得分:5)
connect
需要的是任何可调用的 Python对象。由于Python具有作为第一类对象的功能,因此使用包装函数很容易实现。对于简单的情况,lambda
会执行:
self.connect(pyuic4Button, SIGNAL("clicked()"),
lambda: self.setPath("pyuic4"))
self.connect(pyrcc4Button, SIGNAL("clicked()"),
lambda: self.setPath("pyrcc4"))
答案 1 :(得分:1)
您可以使用QObject::sender()
函数为每个发件人,对象采取不同的行为,有关详细信息,请参阅QObject documentation。
答案 2 :(得分:0)
我不使用PyQt但是看看QSignalMapper文档,应该是一样的。基本上,它允许您将来自不同对象的信号映射到带参数的插槽。
答案 3 :(得分:0)
你可以有一个成员变量来识别对象并执行类似下面的操作。
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
答案 4 :(得分:0)
你甚至可以这样做:
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")