PySide6从0开始学习的笔记(二十一) 使用loadUi直接加载.ui文件

如果不使用pyuic将.ui文件(在designer中组态好的界面文件)转换成.py文件使用,可以使用loadUi的方法直接在代码中加载.ui文件。


一、loadUi的方法

  • PyQt5:
python 复制代码
import sys

from PyQt5 import uic
from PyQt5.QtWidgets import QApplication

def main():
    app = QApplication(sys.argv)
    form = uic.loadUi("form.ui")
    form.show()
    sys.exit(app.exec())

if __name__ == "__main__":
    main()

以及:

python 复制代码
import sys

from PyQt5 import uic
from PyQt5.QtWidgets import QApplication

def main():
    app = QApplication(sys.argv)
    window = uic.loadUi("mainwidow.ui")
    form = uic.loadUi("form.ui")
    window.setCentralWidget(form)
    window.show()
    sys.exit(app.exec())

if __name__ == "__main__":
    main()

  • PySide6:

PySide6稍微有点复杂,需要先创建一个加载器:

python 复制代码
import sys

from PySide6.QtUiTools import QUiLoader
from PySide6.QtWidgets import QApplication


def main():
    # 1. 实例化 QUiLoader
    loader = QUiLoader()
    # 2. 创建应用程序对象
    app = QApplication(sys.argv)
    # 3. 加载 .ui 文件,返回界面根控件
    window = loader.load("mainwidow.ui")
    window.form = loader.load("form.ui", window)
    window.setCentralWidget(window.form)
    # 4. 显示界面
    window.show()
    window.form.pushButton.clicked.connect(lambda: print("clicked"))

    sys.exit(app.exec())

if __name__ == "__main__":
    main()
复制代码
PySide6的特别注意事项:

    实例化加载器(QUiLoader)必须在创建应用程序对象(QApplication)之前,否则程序会卡死在这里。
看代码:
python 复制代码
import sys

from PySide6.QtUiTools import QUiLoader
from PySide6.QtWidgets import QApplication


def main():
    # 1. 实例化 QUiLoader
    # loader = QUiLoader()
    # 2. 创建应用程序对象
    app = QApplication(sys.argv)
    print('创建应用程序完毕')
    loader = QUiLoader()
    print('加载完毕')
    # 3. 加载 .ui 文件,返回界面根控件
    window = loader.load("mainwidow.ui")
    window.form = loader.load("form.ui", window)
    window.setCentralWidget(window.form)
    # 4. 显示界面
    window.show()
    window.form.pushButton.clicked.connect(lambda: print("clicked"))

    sys.exit(app.exec())

if __name__ == "__main__":
    main()

运行结果,卡死在loader:

复制代码
        这也就是qdarkstyle的官方范例不能在pyside6模式下正常运行的原因,它的加载器在应用程序对象(QApplication)之后才创建的。

二、loadUi方法与pyuic方法的比较

与pyuic方法相比,pyuic是将.ui文件转换成.py文件,再将.py文件实例化以后使用,步骤上稍微麻烦一些。但是pyuic方法的优点是.py文件实例化以后,它的所有构件就"透明"了;而loadUi方法是动态创建窗口,窗口的构件在代码中是不可见的。在具有自动代码补全的IDE,比如pycharm中,pyuic方法显然更有优势,它会自动补全子构件名称和检查子构件的合法性。而loadUi方法的代码在IDE中是这样的:

所有构件都是未解析,无法自动补全和检查子构件的合法性。

我的习惯,简单项目用loadUi方法,复杂项目用pyuic方法。

复制代码
相关推荐
花酒锄作田3 小时前
使用 pkgutil 实现动态插件系统
python
前端付豪7 小时前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽7 小时前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
老赵全栈实战8 小时前
Pydantic配置管理最佳实践(一)
python
阿尔的代码屋14 小时前
[大模型实战 07] 基于 LlamaIndex ReAct 框架手搓全自动博客监控 Agent
人工智能·python
AI探索者1 天前
LangGraph StateGraph 实战:状态机聊天机器人构建指南
python
AI探索者1 天前
LangGraph 入门:构建带记忆功能的天气查询 Agent
python
FishCoderh1 天前
Python自动化办公实战:批量重命名文件,告别手动操作
python
躺平大鹅1 天前
Python函数入门详解(定义+调用+参数)
python
曲幽1 天前
我用FastAPI接ollama大模型,差点被asyncio整崩溃(附对话窗口实战)
python·fastapi·web·async·httpx·asyncio·ollama