QPushButton.clicked.connect绑定失效求助:GUI与控制器解耦后无响应
问题原因与解决方案
问题出在startup函数里的ctrl变量——它是函数的局部变量,当函数执行完毕后,Python的垃圾回收机制会回收这个Controller实例。而PySide的信号槽默认使用弱引用,当槽函数所属的对象被回收后,信号连接就失效了,所以点击按钮不会触发任何操作。
解决方法
只需要给ctrl添加一个持久的引用,让它的生命周期和GUI实例保持一致即可。修改startup函数,把控制器绑定到GUI实例上:
def startup(parent): ctrl = Controller() gui = Gui(parent) gui.button.clicked.connect(ctrl.do_stuff) gui.ctrl = ctrl # 将控制器实例绑定到GUI对象,避免被提前回收 return gui
这样修改后,ctrl会随着gui的存在而保持有效,点击按钮就能正常打印"something"了。
补充说明
PySide默认的信号槽连接是弱引用类型,这样设计是为了避免循环引用导致内存泄漏。但如果槽函数的对象没有其他强引用,就会被回收,从而导致连接失效。通过把控制器绑定到GUI实例上,我们给了它一个强引用,确保它在GUI存在期间不会被回收。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

