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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:25:12