PyQt6中如何引用另一窗口对象?解决初始化递归调用错误
如何在PyQt6中引用另一个窗口对象?
问题与报错
当前代码中MainWindow和FilterWindow的初始化方法互相实例化对方,引发无限递归调用,报错信息如下:
初始化调用无限递归 文件 "E:\Work\PythonProjects\MyApp\Ui\main.py",第14行,在__init__中 self.fp = FilterWindow() ^^^^^^^^^^^^^^ 文件 "E:\Work\PythonProjects\MyApp\Ui\main.py",第454行,在__init__中 self.mn = MainWindow() ^^^^^^^^^^^^ SystemError: D:_w\1\s\Objects\longobject.c:1208: bad argument to internal function
错误根源:创建MainWindow时会初始化FilterWindow,而FilterWindow初始化又会创建新的MainWindow,形成无限循环的调用链,最终触发系统错误。
解决方案
方案1:传递窗口引用(直接交互场景)
修改两个窗口类的初始化逻辑,将主窗口实例作为参数传递给子窗口,避免循环实例化:
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget from main_window import Ui_MainWindow from filter_page import Ui_FilterForm import sys class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.filter_page_enabled = 1 self.button_open_filter_page.clicked.connect(self.open_filter_page) # 初始化FilterWindow时传入当前主窗口实例 self.fw = FilterWindow(self) def open_filter_page(self): self.hide() self.fw.show() class FilterWindow(QWidget, Ui_FilterForm): def __init__(self, main_window): super().__init__() self.setupUi(self) # 保存外部传入的主窗口引用,不再自行创建新实例 self.mw = main_window self.button_close_filter_page.clicked.connect(self.change_filter_page_enabled) def change_filter_page_enabled(self): self.mw.filter_page_enabled = 0 self.close() self.mw.show() if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.show() app.exec()
关键修改点:
FilterWindow的__init__新增main_window参数,接收外部传入的主窗口实例MainWindow初始化时将自身self作为参数传递给FilterWindow,完成引用传递
方案2:使用信号槽解耦(推荐解耦场景)
如果窗口间不需要直接操作对方属性,可通过Qt的信号槽机制实现交互,彻底解除两个窗口类的耦合:
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget from PySide6.QtCore import Signal from main_window import Ui_MainWindow from filter_page import Ui_FilterForm import sys class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.filter_page_enabled = 1 self.button_open_filter_page.clicked.connect(self.open_filter_page) self.fw = FilterWindow() # 连接FilterWindow的自定义信号到主窗口的处理方法 self.fw.close_signal.connect(self.on_filter_closed) def open_filter_page(self): self.hide() self.fw.show() def on_filter_closed(self): self.filter_page_enabled = 0 self.show() class FilterWindow(QWidget, Ui_FilterForm): # 定义自定义信号,关闭窗口时触发 close_signal = Signal() def __init__(self): super().__init__() self.setupUi(self) self.button_close_filter_page.clicked.connect(self.change_filter_page_enabled) def change_filter_page_enabled(self): # 发出信号,通知主窗口处理后续逻辑 self.close_signal.emit() self.close() if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.show() app.exec()
关键修改点:
FilterWindow定义close_signal自定义信号,关闭时发出该信号MainWindow连接该信号到自身的on_filter_closed方法,处理窗口切换逻辑- 两个窗口类不再直接持有对方实例,实现了解耦
内容的提问来源于stack exchange,提问作者Aleksei Kolchin
相关产品推荐
相关产品推荐

