如何让pyuic5生成代码时排除connectSlotsByName()?getter使用是否有误?
问题
我使用pyuic5将Qt Designer创建的ui文件转换为py文件,命令为:pyuic5 my_form.ui -o my_form_UI.py。已在Designer的「表单设置」中取消「按名称连接槽」选项,希望手动连接信号与槽,但生成的代码中仍包含QtCore.QMetaObject.connectSlotsByName(MyForm)语句。直接在Designer保存为py文件时该处理正确,但生成的代码依赖PySide,而我需要使用PyQt5。执行示例代码时,该语句会自动调用name属性的getter,请问:
- 是否有办法让pyuic5不生成该语句?
- 我的getter使用是否存在错误?
解答
1. 阻止pyuic5生成connectSlotsByName语句
直接在pyuic5命令中添加--no-auto-connect参数即可,修改后的命令为:
pyuic5 --no-auto-connect my_form.ui -o my_form_UI.py
这个参数会强制禁用自动按名称连接槽的逻辑,生成的代码里就不会出现QtCore.QMetaObject.connectSlotsByName(MyForm)这行代码。
2. getter使用的问题分析
connectSlotsByName的工作逻辑是扫描控件名称,自动匹配命名格式为on_<控件对象名>_<信号名>的槽函数并建立连接。如果你的getter方法命名恰好符合这个格式(比如控件名为name,getter叫on_name_xxx),就会被误触发调用。
如果你的getter只是普通的属性获取方法(比如def name(self):),命名没有符合上述自动匹配规则,那么你的getter使用本身没有错误,问题完全是connectSlotsByName的自动匹配逻辑导致的。只要通过上述参数阻止生成该语句,就能解决这个误触发问题。
内容的提问来源于stack exchange,提问作者vezzon
相关产品推荐
相关产品推荐

