如果不使用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方法。