【Qt for Python官方教程】使用QUiLoader和pyside6-uic导入ui文件

本篇文章介绍如何在 Qt for Python 项目中用 Qt Designer 来创建一个基于 Qt Widgets 的图形界面。Qt Designer 是一个图形化的 UI 设计工具,可以在 pyside6 的目录下找到它 (designer.exe),同时在 Qt Creator IDE 里也可以找到它。Qt Designer 的使用在官网的 Using Qt Designer 教程里详细介绍。

Qt Designer 设计的界面被保存为 .ui 文件,这个文件使用的是基于 XML 的格式。在编译项目时可以使用 pyside6-uic 将其转换为 Python 或 C++ 代码。

要在 Qt Designer 里创建一个新的窗口,点击 文件 - 新建…,选择 “Main Window” 作为模板。将其保存为 mainwindow.ui。在窗口的中央加入一个 QPushButton 组件。

你的 mainwindow.ui 文件应该是像这样的:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>110</x>
      <y>80</y>
      <width>201</width>
      <height>81</height>
     </rect>
    </property>
    <property name="text">
     <string>PushButton</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>400</width>
     <height>20</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

有了 .ui 文件,你可以选择用以下两种方法在 Python 中使用它:

方法一:生成 Python 类

使用 UI 文件的标准方式是将其转换为一个 Python 的类,这可以用 pyside6-uic 实现。在命令行里运行该指令:

pyside6-uic mainwindow.ui > ui_mainwindow.py

我们将该指令的输出重定向到了文件 ui_mainwindow.py 中,这样我们就可以直接引用该文件:

from ui_mainwindow import Ui_MainWindow

现在,我们可以在代码里创建一个自己的类来安装 (Setup) 生成的 Ui_MainWindow。为了理解这个过程,我们来看看示例代码:

import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtCore import QFile
from ui_mainwindow import Ui_MainWindow

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

if __name__ == "__main__":
    app = QApplication(sys.argv)

    window = MainWindow()
    window.show()

    sys.exit(app.exec())

我们的类里只包含了两句用来从 UI 文件中加载 Ui_MainWindow 的代码:

self.ui = Ui_MainWindow()
self.ui.setupUi(self)

注意:
每次改变 UI 文件后,都必须重新运行 pyside6-uic 来将其转换为 Python 类。

方法二:直接加载 UI 文件

我们可以使用 QtUiTools 模块里的 QUiLoader 类来直接加载 UI 文件:

from PySide6.QtUiTools import QUiLoader

QUiLoader 类可以让你动态地载入 UI 文件:

ui_file = QFile("mainwindow.ui")
ui_file.open(QFile.ReadOnly)

loader = QUiLoader()
window = loader.load(ui_file)
window.show()

完整代码示例如下:

# File: main.py
import sys
from PySide6.QtUiTools import QUiLoader
from PySide6.QtWidgets import QApplication
from PySide6.QtCore import QFile, QIODevice

if __name__ == "__main__":
    app = QApplication(sys.argv)

    ui_file_name = "mainwindow.ui"
    ui_file = QFile(ui_file_name)
    if not ui_file.open(QIODevice.ReadOnly):
        print(f"Cannot open {ui_file_name}: {ui_file.errorString()}")
        sys.exit(-1)
    loader = QUiLoader()
    window = loader.load(ui_file)
    ui_file.close()
    if not window:
        print(loader.errorString())
        sys.exit(-1)
    window.show()

    sys.exit(app.exec())

更多关于 Qt for Python 文章,可以查看 PySide6 专栏。

你可能感兴趣的:(PySide6,官方教程)