2011-01-10 55 views
2

例如:PyQt - 插槽参数

我有三个按钮,所有使几乎相同。 我想要所有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

QtCore.QObject.connect(pushButton1,QtCore.SIGNAL (“clicked()”),lambda:slotButtons(1)) 我试过这个,它的工作原理。 – Meloun 2011-01-10 12:17:19

回答

5

什么connect需要什么可调用 Python对象。由于Python具有作为第一类对象的功能,因此使用包装函数很容易实现。对于简单的情况下,lambda会做:

self.connect(pyuic4Button, SIGNAL("clicked()"), 
      lambda: self.setPath("pyuic4")) 
    self.connect(pyrcc4Button, SIGNAL("clicked()"), 
      lambda: self.setPath("pyrcc4")) 
+0

这是lambda express的强大功能:p – Spl2nky 2014-08-25 17:21:56

0

我不使用PyQt,但看看QSignalMapper文档,它应该是相同的。基本上,它允许您将来自不同对象的信号映射到带参数的插槽。

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 
0

你甚至可以这样做:

lambda value: self.doStuff(True if value==True else False) 

它很伟大的工具,一旦你弄清楚它是如何工作的。

编辑: 您也可以跳过做所有的IFS /其他... 就直奔点... - 粗糙例如:

btn_01 = lambda: self.doStuff("C://") 
btn_02 = lambda: self.doStuff("D://") 

def doStuff(self,dir): 
    saveFile(dir+"filename.txt")