PyQt6多窗口信息传递遇AttributeError报错求解决方案
PyQt6 多窗口通信报错:AttributeError: 'bool' object has no attribute 'submitted'
错误原因
- 信号连接方式错误:在
Ui_Settings.setupUi中,你直接将按钮的clicked信号连接到Comm.on_submit类方法,而非Comm实例的方法。当按钮触发点击事件时,Qt会把clicked信号的默认参数(布尔值,标识按钮选中状态)传入on_submit,此时方法内的self变成了这个布尔值,而非Comm实例,因此触发'bool' object has no attribute 'submitted'错误。 - 全局对象引用不规范:
on_submit中直接使用全局ui对象,存在作用域风险,不符合PyQt的封装规范。
修复方案
1. 修改Settings1.py代码
调整Comm与Ui_Settings的关联方式,让Ui_Settings持有Comm实例,并通过实例方法触发信号:
from PyQt6 import QtCore, QtWidgets class Comm(QtCore.QObject): submitted = QtCore.pyqtSignal(str, str, str, str, str) def __init__(self): super().__init__() class Ui_Settings(object): def setupUi(self, Settings): Settings.setObjectName("Settings") Settings.resize(440, 235) # 按钮初始化(保留Qt Designer生成的代码) self.saveSettings = QtWidgets.QPushButton(Settings) self.saveSettings.setGeometry(QtCore.QRect(240, 200, 93, 28)) self.saveSettings.setObjectName("saveSettings") # 初始化Comm实例并绑定到Ui_Settings self.comm = Comm() # 连接按钮点击到当前实例的submit方法 self.saveSettings.clicked.connect(self.submit) # 补充Qt Designer生成的其他控件初始化代码(如lineEdit等,你提供的代码中省略了这部分,实际需保留) def submit(self): # 从当前Ui_Settings实例的控件中获取数据,触发信号 self.comm.submitted.emit( self.lineEdit.text(), self.lineEdit_2.text(), self.lineEdit_3.text(), self.lineEdit_4.text(), self.lineEdit_5.text(), ) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) Settings = QtWidgets.QDialog() ui = Ui_Settings() ui.setupUi(Settings) Settings.show() sys.exit(app.exec())
2. 修改主窗口代码
调整窗口类型匹配度,并连接Ui_Settings实例中Comm的信号:
from PyQt6 import QtWidgets from settings1 import Ui_Settings class Ui_Dialog(object): def openWindow(self): # 与测试代码一致,使用QDialog而非QMainWindow self.window = QtWidgets.QDialog() self.ui = Ui_Settings() self.ui.setupUi(self.window) self.ui.set_fields(self.kernelSize, self.input2, self.input3, self.input4) # 连接Ui_Settings实例内的comm信号到更新方法 self.ui.comm.submitted.connect(self.updateSettings) self.window.show() def updateSettings(self, kernel, i2, i3, i4, kvals): self.kernelSize = kernel self.input2 = i2 self.input3 = i3 self.input4 = i4 self.kernel_vals = kvals # 修复3x3矩阵赋值的索引错误 self.kernel_ints = list(map(int, kvals.split(","))) self.manKernel = [[0 for _ in range(3)] for _ in range(3)] for idx, val in enumerate(self.kernel_ints): row = idx // 3 col = idx % 3 if row < 3 and col < 3: self.manKernel[row][col] = val
额外注意事项
- 必须保留Qt Designer生成的所有控件初始化代码(如
lineEdit等),否则会出现控件未定义的错误。 - 主窗口打开子窗口时,窗口类型要匹配:测试代码中用的是
QDialog,主窗口内不要误用QMainWindow,避免布局异常。 updateSettings中原矩阵赋值逻辑存在索引越界问题,已修复为按行=索引//3,列=索引%3的方式填充3x3矩阵。
内容的提问来源于stack exchange,提问作者Birinder Singh
相关产品推荐
相关产品推荐

