PyQt - 带参数的插槽

时间:2011-01-10 12:03:24

标签: python pyqt slots

示例:

我有三个按钮,几乎都是一样的。 我希望所有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)可以做些什么吗?

5 个答案:

答案 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")