虽然网上教程很多,还是记一下以备查阅。
注意我这里主界面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。
所以我觉得最好先用动态加载的方法把界面先搞定,然后写代码时再切到静态加载方法。