2

例子:

我有三个按钮,几乎都一样。我只想为所有 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) 能做到这一点吗?

4

5 回答 5

5

需要connect的是任何可调用的Python 对象。由于 Python 具有作为一等对象的函数,因此使用包装函数很容易实现。对于简单的情况, alambda会这样做:

    self.connect(pyuic4Button, SIGNAL("clicked()"),
            lambda: self.setPath("pyuic4"))
    self.connect(pyrcc4Button, SIGNAL("clicked()"),
            lambda: self.setPath("pyrcc4"))
于 2011-01-10T12:18:08.140 回答
1

您可以使用QObject::sender()函数对每个发送者、对象进行不同的行为,有关详细信息,请参阅QObject 文档

于 2011-01-10T12:09:44.570 回答
0

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

于 2011-01-10T12:05:58.530 回答
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
于 2011-01-10T12:08:47.547 回答
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")
于 2016-06-26T19:09:41.513 回答