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
相关产品推荐
相关产品推荐

