QtCreator设计的UI无法应用到Python窗口,始终显示空白
问题
新安装QtCreator,配置了全新的Python3.8环境,已通过pip安装PySide2和PySide6。创建「Qt for Python-窗口(UI文件)」项目后,无论对UI文件做何种修改(比如添加按钮、调整窗口尺寸),运行程序时窗口始终显示空白且为默认大小。尝试过切换QDialog/QMainWindow、PySide2/PySide6,也确认UI文件路径正确,但问题依旧。项目默认代码如下:
# This Python file uses the following encoding: utf-8 import os from pathlib import Path import sys from PySide2.QtWidgets import QApplication, QDialog from PySide2.QtCore import QFile from PySide2.QtUiTools import QUiLoader class Dialog(QDialog): def __init__(self): super(Dialog, self).__init__() self.load_ui() def load_ui(self): loader = QUiLoader() path = os.fspath(Path(__file__).resolve().parent / "form.ui") ui_file = QFile(path) ui_file.open(QFile.ReadOnly) loader.load(ui_file, self) ui_file.close() if __name__ == "__main__": app = QApplication([]) widget = Dialog() widget.show() sys.exit(app.exec_())
解决方法
核心问题是你没把UI加载后的根控件设置为当前窗口的主内容——在C++里用ui->setupUi(this)时会自动完成这一步,但Python的QUiLoader.load()需要手动处理返回的控件。下面是两种可行的修改方式:
方式一:直接使用加载后的UI控件作为主窗口
不需要继承QDialog,直接加载UI并显示,最简单直接:
# This Python file uses the following encoding: utf-8 import os from pathlib import Path import sys from PySide2.QtWidgets import QApplication from PySide2.QtCore import QFile from PySide2.QtUiTools import QUiLoader if __name__ == "__main__": app = QApplication([]) loader = QUiLoader() path = os.fspath(Path(__file__).resolve().parent / "form.ui") ui_file = QFile(path) ui_file.open(QFile.ReadOnly) widget = loader.load(ui_file) # 获取加载完成的UI控件 ui_file.close() widget.show() sys.exit(app.exec_())
方式二:保留类继承结构并正确挂载UI
如果需要基于QDialog/QMainWindow扩展功能,要把加载后的UI控件设为窗口的子控件,并调整窗口大小适配UI:
# This Python file uses the following encoding: utf-8 import os from pathlib import Path import sys from PySide2.QtWidgets import QApplication, QDialog, QVBoxLayout from PySide2.QtCore import QFile from PySide2.QtUiTools import QUiLoader class Dialog(QDialog): def __init__(self): super(Dialog, self).__init__() self.load_ui() def load_ui(self): loader = QUiLoader() path = os.fspath(Path(__file__).resolve().parent / "form.ui") ui_file = QFile(path) ui_file.open(QFile.ReadOnly) # 获取UI根控件并设置父对象为当前窗口 self.ui_widget = loader.load(ui_file, self) ui_file.close() # 用布局包裹UI控件,让窗口自动适配大小 layout = QVBoxLayout(self) layout.addWidget(self.ui_widget) self.setLayout(layout) # 让窗口自适应UI的尺寸 self.adjustSize() if __name__ == "__main__": app = QApplication([]) widget = Dialog() widget.show() sys.exit(app.exec_())
关键区别说明
在C++中,setupUi(this)会自动完成三个动作:将UI控件的父对象设为当前窗口、把UI根控件作为窗口的主内容、调整窗口大小适配UI;但Python的QUiLoader.load(parent)仅完成第一步,剩下的需要手动处理——这就是你看不到UI内容的核心原因。
如果切换到PySide6,只需把代码中所有PySide2替换为PySide6即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Mister Mystère
相关产品推荐
相关产品推荐

