PyQt5/PySide2按钮clicked信号绑定函数不触发问题咨询
问题原因分析
核心原因是Qt信号的connect()方法要求传入可调用对象的引用,而你加了括号调用函数时,实际传入的是函数执行后的返回值,而非函数本身。
不同写法的差异说明
错误写法:
代码执行到这一行时,会立刻调用self.ui.pushButton_2.clicked.connect(self.my_text())self.my_text()(你可以观察到窗口初始化时控制台就会打印一次1 button clicked),而这个函数没有定义返回值,默认返回None,等同于你给信号绑定了None,后续点击按钮自然不会触发任何操作。正常工作的lambda写法:
这里传入self.ui.pushButton_2.clicked.connect(lambda: self.my_text())connect()的是匿名lambda函数的引用,并没有被立刻执行,只有当按钮点击触发clicked信号时,才会调用这个lambda函数,再执行内部的self.my_text(),所以功能符合预期。你提到的
该写法和第一种错误写法逻辑完全一致,如果确实加了括号是不可能正常工作的,大概率是你测试时出现了笔误,实际生效的是没有括号的写法connect(self.on_button1())写法说明connect(self.on_button1):这种写法直接传入方法的引用,没有提前执行,是无参槽函数的标准绑定写法。
推荐的正确写法
如果你的槽函数不需要传递额外参数,直接传入方法名(不加括号)即可,是性能最好也最简洁的写法:
self.ui.pushButton_2.clicked.connect(self.my_text)
如果需要传递自定义参数,再选择lambda或者functools.partial实现即可。
内容的提问来源于stack exchange,提问作者gogogo
相关产品推荐
相关产品推荐

