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

如何将pyuic5生成的Python类加入QStackedWidget?

解决PyQt5堆叠部件添加UI类的类型错误问题

你遇到的问题核心是:pyuic5生成的Ui_home/Ui_login_page类仅负责界面元素的初始化,本身并非QWidget子类,而QStackedWidget.addWidget()要求传入QWidget类型的对象。

可以通过以下两种方式修改代码:

方法1:将每个页面封装为独立的QWidget子类

把每个UI对应的页面封装成继承自QWidget的类,在类内部加载UI文件生成的代码,这样每个页面实例就是合法的QWidget对象。

修改后的代码:

from PyQt5 import QtWidgets
from screens import Ui_home, Ui_login_page


class HomePage(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_home()
        self.ui.setupUi(self)


class LoginPage(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_login_page()
        self.ui.setupUi(self)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        
        # 创建页面实例
        self.home_page = HomePage()
        self.login_page = LoginPage()
        
        # 初始化堆叠部件并添加页面
        self.screens = QtWidgets.QStackedWidget()
        self.screens.addWidget(self.home_page)
        self.screens.addWidget(self.login_page)
        
        # 将堆叠部件设为主窗口的中心部件
        self.setCentralWidget(self.screens)
        
        # 绑定按钮跳转事件
        self.home_page.ui.pushButton.clicked.connect(
            lambda: self.screens.setCurrentWidget(self.login_page)
        )


if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

方法2:直接创建QWidget容器加载UI

如果不想封装独立类,可以直接在主窗口中创建QWidget实例,作为UI的载体:

修改后的代码:

from PyQt5 import QtWidgets
from screens import Ui_home, Ui_login_page


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        
        # 创建首页容器并加载UI
        self.home_container = QtWidgets.QWidget()
        self.home = Ui_home()
        self.home.setupUi(self.home_container)
        
        # 创建登录页容器并加载UI
        self.login_container = QtWidgets.QWidget()
        self.login = Ui_login_page()
        self.login.setupUi(self.login_container)
        
        # 初始化堆叠部件并添加容器(即页面)
        self.screens = QtWidgets.QStackedWidget()
        self.screens.addWidget(self.home_container)
        self.screens.addWidget(self.login_container)
        
        # 设置中心部件
        self.setCentralWidget(self.screens)
        
        # 绑定跳转事件
        self.home.pushButton.clicked.connect(
            lambda: self.screens.setCurrentWidget(self.login_container)
        )


if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

关键说明

  • 两种方法的核心都是给每个UI类提供一个QWidget类型的载体,让QStackedWidget能识别并添加。
  • 注意要把堆叠部件设置为主窗口的centralWidget,否则页面不会显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:20:20