PySide2信号绑定lambda报错:int无对应方法但变量为类对象
问题原因
你遇到的报错是Qt信号的默认传参覆盖了lambda的默认参数导致的:
你绑定的myOtherMethod(实际是开关按钮的stateChanged信号)触发时会主动传递一个int类型的状态值(开关关对应0、开对应2,和你排查到的输出完全吻合),这个值会作为第一个参数传入lambda,直接覆盖了你预先设置的obj=myObject默认值,所以你拿到的obj变成了int类型,自然找不到myMethod方法。
这不是循环变量捕获的常见问题,是Qt信号传参的特性导致的。
解决方案
下面两种方案都可以解决:
方案1:调整lambda参数顺序,预留位置接收信号参数
给lambda加一个占位参数接收信号传递的状态值,把你需要绑定的对象放到第二个参数位,默认值就不会被覆盖:
myOtherObject = myOtherClass() for i in range(10): myObject = myClass(i) # 第一个参数接收信号传的状态值,不需要可以直接忽略 myOtherObject.myOtherMethod.connect(lambda state, obj=myObject: obj.myMethod())
如果不确定信号会传几个参数,可以用*args通用接收所有额外参数,适用性更强:
myOtherObject.myOtherMethod.connect(lambda *args, obj=myObject: obj.myMethod())
方案2:使用functools.partial绑定参数
functools.partial会在绑定时立即求值并固定传入的参数,不会被后续信号触发时的传参干扰,写法更不容易出错:
from functools import partial myOtherObject = myOtherClass() for i in range(10): myObject = myClass(i) myOtherObject.myOtherMethod.connect(partial(myObject.myMethod))
如果你的myMethod需要接收参数,也可以直接在partial里传递,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Geoffrey
相关产品推荐
相关产品推荐

