PySide2弹出QDialog后主窗口无响应且报AttributeError求助
PySide2弹窗引发主窗口无响应及AttributeError问题解决
问题现象
- 基于QMainWindow开发的主窗口,打开QDialog类型弹窗后失去响应
- 切换主窗口
stackedWidget索引时触发错误:AttributeError: 'Ui_popupHideSuccess' object has no attribute 'stackedWidget'
提供的代码片段
主窗口启动代码
if __name__ == '__main__': app = QApplication(sys.argv) myWindow = MainWindow() myWindow.show() sys.exit(app.exec_())
弹窗打开代码
def showPopupSuccessHide(self): self.window = QDialog() self.ui = Ui_popupHideSuccess() self.ui.setupUi(self.window) self.window.show()
问题根源
- AttributeError错误:打开弹窗时,你用弹窗的UI对象覆盖了主窗口的
self.ui引用。主窗口原本的self.ui包含stackedWidget,但弹窗UI没有该属性,后续切换索引时自然报错。 - 主窗口无响应:UI引用被覆盖导致主窗口事件处理逻辑异常,进而出现无响应;若弹窗内有未异步处理的耗时操作,也会阻塞主线程。
修复方案
1. 避免覆盖主窗口UI引用
改用独立的实例变量存储弹窗相关对象,同时给弹窗设置主窗口为父对象,优化窗口管理:
def showPopupSuccessHide(self): # 用独立变量存储弹窗和其UI,不覆盖主窗口的self.ui self.popup_window = QDialog(self) self.popup_ui = Ui_popupHideSuccess() self.popup_ui.setupUi(self.popup_window) self.popup_window.show()
2. 异步处理耗时操作(若有)
如果弹窗内存在耗时任务,必须放到子线程执行,避免阻塞主线程(UI操作必须在主线程):
from PySide2.QtCore import QThread, Signal # 定义子线程类处理耗时逻辑 class TaskThread(QThread): task_done = Signal() def run(self): # 替换为实际的耗时操作,如文件读写、网络请求 import time time.sleep(2) self.task_done.emit() def showPopupSuccessHide(self): self.popup_window = QDialog(self) self.popup_ui = Ui_popupHideSuccess() self.popup_ui.setupUi(self.popup_window) # 启动子线程执行耗时任务 self.task_thread = TaskThread() self.task_thread.task_done.connect(lambda: print("任务完成")) self.task_thread.start() self.popup_window.show()
3. 验证修复效果
修复后,主窗口的self.ui仍指向自身UI对象,切换stackedWidget索引时能正常访问self.ui.stackedWidget,弹窗打开后主窗口也可正常交互。
内容的提问来源于stack exchange,提问作者angxlo
相关产品推荐
相关产品推荐

