PyQt信号connect触发TypeError: Qt.ConnectionType expected报错排查
问题根因
报错直接由最后一行的信号绑定语法错误触发:
- PyQt的
connect()方法第一个位置参数必须传入可调用的槽函数对象,可选的第二个位置参数才是Qt.ConnectionType枚举值。你写的connect(self,prediction(...))错误传入了两个位置参数:第一个是self(也就是Ui_Quiz类实例),第二个是prediction()函数立刻执行后的返回值。PyQt在解析第二个参数时发现不是预期的连接类型枚举,直接抛出TypeError: Qt.ConnectionType expected, not 'Ui_Quiz'。 - 这段绑定代码还有两个隐藏逻辑错误:
- 直接在
connect()括号内调用prediction(参数),会导致界面初始化到这行代码时就立刻执行预测逻辑,完全不会等用户点击按钮 - 你在setupUi初始化阶段就提前获取输入框内容赋值给age、gender等变量,一方面错误覆盖了QLineEdit自带的
.text方法(你写的self.lineEdit.text = 0直接把输入框的text方法替换成了整数0,会导致输入框功能异常),另一方面初始化阶段用户还没输入内容,就算写对了取值逻辑也拿不到用户后续输入的真实值。
- 直接在
修复步骤
- 删除setupUi中所有提前给输入框text属性赋值、提前获取输入值存为实例变量的代码,也就是以下片段全部移除:
self.lineEdit.text = 0 self.age = int(self.lineEdit.text) self.lineEdit_2.text = 0 self.gender = int(self.lineEdit_2.text) self.lineEdit_3.text = 0 self.openness = int(self.lineEdit_3.text) self.lineEdit_4.text = 0 self.neuroticism = int(self.lineEdit_4.text) self.lineEdit_5.text = 0 self.conscientiousness = int(self.lineEdit_5.text) self.lineEdit_6.text = 0 self.agreeableness = int(self.lineEdit_6.text) self.lineEdit_7.text = 0 self.extraversion = int(self.lineEdit_7.text) - 替换最后一行错误的信号绑定代码,用lambda包裹传参逻辑,保证点击按钮时才实时获取输入值、执行预测函数:
self.pushButton.clicked.connect(lambda: self.prediction( int(self.lineEdit_2.text()), # 性别 int(self.lineEdit.text()), # 年龄 int(self.lineEdit_3.text()), # 开放性 int(self.lineEdit_4.text()), # 神经质 int(self.lineEdit_5.text()), # 尽责性 int(self.lineEdit_6.text()), # 宜人性 int(self.lineEdit_7.text()) # 外向性 ))
注意事项
- 给绑定的槽函数传自定义参数时,必须用lambda或者functools.partial包一层,不能直接在connect里调用带括号的槽函数,否则会立即执行而非触发时执行
- QLineEdit获取输入内容必须调用
.text()方法(带括号),不要直接给.text属性赋值,否则会覆盖原生方法导致控件异常 - 后续建议在int()转换前加输入合法性校验,避免用户输入非数字内容时触发类型转换报错。
内容的提问来源于stack exchange,提问作者Gülçe Hocagil
相关产品推荐
相关产品推荐

