虽然网上教程很多,还是记一下以备查阅。
注意我这里主界面ui文件是一个QWidget,不是一个QMainWindow,QMainWindow的稍有不同。

动态加载

动态加载不用将ui文件转换为py文件,边改界面就能边用,很是方便,适合绝大多数情况,这种方法唯一的缺点大概就是编程时控件不能进行自动补全,因为IDE没法知道控件继承自哪里。

from PySide2.QtWidgets import QApplication
from PySide2.QtUiTools import QUiLoader


class Window:
    def __init__(self):
        self.ui = QUiLoader().load('view.ui') # 假设我们的ui文件为view.ui


app = QApplication([])
window = Window()
window.ui.show()
app.exec_()

官网教程:https://doc.qt.io/qtforpython/tutorials/basictutorial/uifiles.html

from PyQt5.QtWidgets import QApplication
from PyQt5 import uic


class Window:
    def __init__(self):
        self.ui = uic.loadUi("view.ui")


app = QApplication([])
window = Window()
window.ui.show()
app.exec_()

静态加载

就是先用uic工具将ui文件转换成py文件,然后再导入ui文件,每次ui文件更新都需要重新转换一次。适合需要对控件功能进行重写的场合,一句话就是辅助手写ui而已,另一个在用pyinstaller打包时这样应该能减小打包后的体积,因为转换出来的py文件默认from PySide2.QtWidgets import *,直接导入了所有包,如果按需导入的话应该可以减小一点体积,不过经我测试只减小了1M不到的体积,意义不大。

from PySide2.QtWidgets import QApplication, QWidget
from view import Ui_Form
import sys


class Window(QWidget):  # 这里继承QWidget,因为我的ui主界面是Widget,官网上这点不一样
    def __init__(self):
        super().__init__()
        self.ui = Ui_Form()
        self.ui.setupUi(self)


if __name__ == "__main__":
    app = QApplication([])
    window = Window()
    window.show()  # 这里不是self.ui
    app.exec_()


和前面类似,注意要用Pyqt5的uic工具进行转换才行,因为生成的py文件自动导入的包名不一样。

总结

动态加载不能进行代码自动补全,打包时ui文件也必须一同打包;静态加载每次手动转换麻烦了点,但转换后因为有了明确的代码可以自动补全代码,进行一些高级编程时有问题也可以更好的debug。
所以我觉得最好先用动态加载的方法把界面先搞定,然后写代码时再切到静态加载方法。

Last modification:June 2nd, 2020 at 09:32 pm