如何在另一个窗体中使用Qt Designer创建的窗体?PyQt5报错求助
解决Qt Designer生成界面在主窗口中作为部件使用的报错问题
首先咱们得明确:你用Pyuic5生成的Ui_Frame类本质是一个界面配置类,它本身不是可直接显示的Qt部件(比如QFrame、QWidget),它的setupUi方法需要接收一个实际的Qt容器对象,才能把设计好的界面元素挂载到这个容器上。你直接实例化page_frame()但没完成后续绑定步骤,这就是报错的核心原因。
下面给你两种正确的使用方式:
方式1:直接创建容器并调用setupUi
这是最直接的快速集成写法:
from PyQt5.QtWidgets import QMainWindow, QFrame from python_file1 import Ui_Frame as page_frame class AppWindow(QMainWindow): def __init__(self): super().__init__() # 务必调用父类初始化方法,否则Qt部件初始化不完整 # 1. 创建对应Qt Designer里的容器部件(这里是QFrame) self.my_page_container = QFrame() # 2. 实例化界面配置类 self.my_page = page_frame() # 3. 调用setupUi把界面挂载到容器上 self.my_page.setupUi(self.my_page_container) # 4. 将容器设置为主窗口的中心部件(或添加到指定布局) self.setCentralWidget(self.my_page_container) # 可选:设置主窗口初始尺寸 self.resize(800, 600)
方式2:继承容器类+界面类(工程化推荐写法)
这种方式能让你的自定义部件直接拥有界面的所有元素,使用起来更便捷:
from PyQt5.QtWidgets import QMainWindow, QFrame from python_file1 import Ui_Frame # 继承Qt容器类(对应Designer里的父容器类型)和界面配置类 class MyPage(QFrame, Ui_Frame): def __init__(self, parent=None): super().__init__(parent) # 调用setupUi初始化界面,这里self就是当前的QFrame实例 self.setupUi(self) # 主窗口类 class AppWindow(QMainWindow): def __init__(self): super().__init__() # 直接实例化自定义的完整部件 self.my_page = MyPage() self.setCentralWidget(self.my_page) self.resize(800, 600)
额外注意事项
- 绝对不要省略父类的
__init__调用!你原代码里AppWindow的__init__没写super().__init__(),这会导致Qt部件初始化不完整,也是潜在的报错诱因。 - 确保
python_file1.py和主脚本在同一目录,或者已将其所在目录添加到Python搜索路径,避免导入错误。
内容的提问来源于stack exchange,提问作者mohammad bagher Malekhosseini




