You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt6多窗口信息传递遇AttributeError报错求解决方案

PyQt6 多窗口通信报错:AttributeError: 'bool' object has no attribute 'submitted'

错误原因

  1. 信号连接方式错误:在Ui_Settings.setupUi中,你直接将按钮的clicked信号连接到Comm.on_submit类方法,而非Comm实例的方法。当按钮触发点击事件时,Qt会把clicked信号的默认参数(布尔值,标识按钮选中状态)传入on_submit,此时方法内的self变成了这个布尔值,而非Comm实例,因此触发'bool' object has no attribute 'submitted'错误。
  2. 全局对象引用不规范: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:15:43