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

PyQt5切换窗口报错:如何正确关闭当前窗口并打开新窗口?

问题解决:PyQt5窗口切换错误及正确实现

错误根源

你遇到的TypeError是因为UI文件的顶层窗口类型与代码中窗口类的基类不匹配:

  • 你的Window2类继承自QMainWindow,但window2.ui文件的顶层窗口是QDialog类型,uic.loadUi加载时会严格检查基类一致性,因此抛出错误。

解决方案

步骤1:修正窗口类的基类

根据window2.ui的实际顶层窗口类型,修改Window2的继承类:

  • 若window2.ui是Qt Designer创建的对话框(QDialog),将Window2改为继承QDialog:
class Window2(qtw.QDialog):
    def __init__(self):
        super().__init__()
        uic.loadUi("window2.ui", self)
  • 若希望window2.ui是主窗口(QMainWindow),打开Qt Designer,将window2.ui的顶层窗口类型改为QMainWindow,保持Window2继承QMainWindow即可。

步骤2:正确实现窗口切换(关闭当前窗口+打开新窗口)

原代码中self.hide()仅隐藏当前窗口,并非彻底关闭。若需要关闭当前窗口并打开新窗口,修改showData方法:

def showData(self):
    print(self.leInput.text())  
    # 创建并显示新窗口
    self.w = Window2()
    self.w.show()
    # 关闭当前主窗口
    self.close()

完整修改后的代码

import PyQt5.QtWidgets as qtw
from PyQt5 import uic
import sys
import os

# 根据window2.ui的类型修改基类,此处假设为QDialog
class Window2(qtw.QDialog):
    def __init__(self):
        super().__init__()
        uic.loadUi("window2.ui", self)

class MainWindow(qtw.QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi("selectWindow.ui", self)
        self.path = os.path.abspath(os.path.dirname(sys.argv[0]))
        self.pbStart.clicked.connect(self.showData)    
    
    def showData(self):
        print(self.leInput.text())  
        self.w = Window2()
        self.w.show()
        self.close()  # 关闭当前窗口,替代hide()

if __name__ == '__main__':
    app = qtw.QApplication(sys.argv) 
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())

补充说明

  • PyQt默认会在最后一个窗口关闭时退出应用,因此新窗口打开后关闭主窗口,应用会正常保留新窗口直到其关闭。
  • 若需要支持返回主窗口的场景,可考虑使用QStackedWidget实现单窗口内的页面切换,避免多窗口管理的复杂度。

内容的提问来源于stack exchange,提问作者Rapid1898

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:01:11