Qt4 将信号连接到具有多个参数的函数?

Qt4 将信号连接到具有多个参数的函数?,qt4,pyqt4,Qt4,Pyqt4,我在python def中有这个函数: def niveau(controlName,idNiveau) 我想通过以下方式将其连接到该信号: QObject.connect(dialog.findChild(QDialogButtonBox, 'buttonBox'), SIGNAL('accepted()'),niveau(control,1)) 我得到了以下错误: Qt信号不可调用 有人能帮我吗 您得到的错误是因为QObject.connect带有3个参数意味着: QObject.con

我在python def中有这个函数:

def niveau(controlName,idNiveau)
我想通过以下方式将其连接到该信号:

QObject.connect(dialog.findChild(QDialogButtonBox, 'buttonBox'), SIGNAL('accepted()'),niveau(control,1))
我得到了以下错误:

Qt信号不可调用


有人能帮我吗

您得到的错误是因为
QObject.connect
带有3个参数意味着:

QObject.connect(QObject,SIGNAL(),可调用,Qt.ConnectionType=Qt.AutoConnection)

您传递的第三个参数不是可调用的,而是调用niveau(control,1)的返回值

发射信号时使用的参数是在发射时确定的,而不是在连接时确定的。如果要在连接时指定某些(或所有)参数,可以:

  • 使用
    functools.partial

    from functools import partial
    QObject.connect(... , partial(niveau, control, 1))
    
  • 使用lambda

    QObject.connect(... , lambda ctrl=control, id=1: niveau(ctrl, id))
    
编辑:


顺便说一句,你真的应该使用-老式的信号。

非常感谢你的回答,但我多次使用我的函数(niveau)并使用不同的参数:QObject.connect(按钮1…,lambda:niveau(控制,1))QObject.connect(按钮2…,lambda:niveau(控制,2))QObject.connect(按钮3…,lambda:niveau(控制,3))因此,在这个例子中,他只使用了最后一个参数3???您可能正在循环中创建连接-问题是lamdbdas的作用域是它们在其中创建的局部作用域。因此,如果变量发生变化,它也会在lambda中发生变化,因此您将始终看到最后一个值
3
。这与描述的行为相同。这就是为什么
partial
在这里更可取的原因(我首先列出了它),它没有这个问题。我会更新我的答案来解释这一点。