在 PyQt 或 PySide 中,加载 Qt Designer 生成的 .ui
文件有两种常见方法:
- 使用
pyuic
将.ui
文件转换为 Python 代码。 - 动态加载
.ui
文件。
以下是两种方法的详细说明和示例代码。
方法 1:使用 pyuic
将 .ui
文件转换为 Python 代码
步骤
-
使用 Qt Designer 创建并保存
.ui
文件(如main_window.ui
)。 -
使用
pyuic5
工具将.ui
文件转换为 Python 代码:pyuic5 main_window.ui -o ui_main_window.py
这会生成一个
ui_main_window.py
文件,其中包含 UI 的 Python 代码。 -
在代码中导入生成的 UI 类并继承它。
示例代码
假设生成的 UI 类名为 Ui_MainWindow
:
from PyQt5.QtWidgets import QApplication, QMainWindow
from ui_main_window import Ui_MainWindow # 导入生成的 UI 类class MainWindow(QMainWindow, Ui_MainWindow):def __init__(self):super().__init__()self.setupUi(self) # 初始化 UIif __name__ == "__main__":app = QApplication([])window = MainWindow()window.show()app.exec_()
方法 2:动态加载 .ui
文件
步骤
- 使用 Qt Designer 创建并保存
.ui
文件(如main_window.ui
)。 - 使用
PyQt5.uic.loadUi
或PySide2.uic.loadUi
动态加载.ui
文件。
示例代码
使用 PyQt5
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication, QMainWindowclass MainWindow(QMainWindow):def __init__(self):super().__init__()loadUi("main_window.ui", self) # 动态加载 UI 文件if __name__ == "__main__":app = QApplication([])window = MainWindow()window.show()app.exec_()
使用 PySide2
from PySide2.QtWidgets import QApplication, QMainWindow
from PySide2.uic import loadUiclass MainWindow(QMainWindow):def __init__(self):super().__init__()loadUi("main_window.ui", self) # 动态加载 UI 文件if __name__ == "__main__":app = QApplication([])window = MainWindow()window.show()app.exec_()
两种方法的对比
方法 | 优点 | 缺点 |
---|---|---|
pyuic 转换 | - 代码直接嵌入 Python 文件,便于调试和修改。 - 性能稍高。 | - 每次修改 .ui 文件后需要重新生成 Python 代码。 |
动态加载 .ui 文件 | - 无需生成额外的 Python 文件,直接加载 .ui 文件。- 更灵活。 | - 运行时加载,性能稍低。 - 调试时无法直接查看 UI 的 Python 代码。 |
动态加载 .ui
文件的进阶用法
1. 加载到自定义控件
你可以将 .ui
文件加载到一个自定义控件中,而不是主窗口。例如:
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QWidgetclass CustomWidget(QWidget):def __init__(self):super().__init__()loadUi("custom_widget.ui", self) # 加载到自定义控件
2. 加载到布局中
你可以将 .ui
文件加载到一个布局中,然后将其添加到主窗口:
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QVBoxLayout, QWidgetclass MainWindow(QWidget):def __init__(self):super().__init__()layout = QVBoxLayout(self)custom_widget = QWidget()loadUi("custom_widget.ui", custom_widget) # 加载到布局layout.addWidget(custom_widget)
总结
pyuic
转换:适合需要直接修改 UI 代码的场景。- 动态加载
.ui
文件:适合需要快速开发和动态加载的场景。
根据项目需求选择合适的方法即可。