qt 简介#

qt 为兼容 Qt5 和 Qt6 提供了统一接口。由于 PySide6 更加 Pythonic,故而着重致力于集成 PySide6,其他 Qt 模块可能支持不完善。

Qt for Python 提供了 Qt 的官方 Python 绑定,使您能够使用 Python 编写 Qt 应用程序。该项目主要包含两个组件:

  • PySide6:在 Python 应用程序中使用 Qt6 API;

  • Shiboken6:绑定生成工具,可用于将 C++ 项目暴露给 Python,以及一个带有一些实用函数的 Python 模块。

Qt、QML、Widgets 它们之间有什么区别?#

请记住,Qt 最初是作为 C++ 框架用 C++ 设计和编写的,你会发现许多引用、示例和概念在基于 C++ 的应用程序中是有意义的,这些可能在你的 Python 应用程序中并不相关。但请记住,Qt for Python 的目标是将 Qt 框架暴露给 Python,并进行了许多适配。使用 Qt for Python 不需要了解 C++,稍后你可以找到这些语言之间的所有可能组合。

Qt#

Qt 项目是开放的协作平台,负责协调 Qt 框架的开发。你可能会遇到“Qt”既指代项目本身,也指代框架的情况。

作为框架,Qt 有许多组件,这些组件通过模块和库进行分发,例如,qtbase 是基础组件,包含许多模块,如 QtCoreQtGuiQtWidgetsQtNetwork 等。所有这些模块都包含许多可以直接使用的类,比如 QtCore 中的类,你可以找到像 QFileQTimeQByteArray 等类。

你可以使用这些类创建没有用户界面的应用程序,例如命令行应用程序、处理文件、网络连接、正则表达式、文本编码等。

另一方面,你可以使用 QtWidgets 模块中的类创建图形化应用程序,这也被称为 Widgets

还有许多其他 Qt 模块,如 QtMultimediaQtChartsQt3D 等。这些模块具有特定的功能,其中名为 QtDeclarative 的模块,你可以在其中找到 QML 声明式语言的实现。这种语言类似于 CSS 和 JSON,它被创建出来是为了声明式地设计 UI 应用程序,允许 JavaScript 处理一些命令式部分,并使其他组件能够扩展和连接 C++ 代码。

Widgets#

正如我们之前提到的,QtWidgets 是提供预定义小部件(Widgets)的模块,你可以将这些小部件添加到你的图形化应用程序中,比如按钮、标签、框、菜单等。

基于小部件的应用程序看起来像原生应用程序,因为目标是不影响用户体验,使其与其他内置应用程序保持一致。

QML#

QML 提供了一种与小部件(Widgets)不同的创建用户界面的方法,最初是为了移动应用开发而设计的。结合 Qt Quick 模块,它提供了与移动设备交互的访问权限,例如点击、拖放、动画、状态、过渡、抽屉菜单等操作。

你可以在 QML/Quick 应用程序中找到的元素侧重于提供更动态的应用基础设施,这些元素具有基于特定行为的不同属性。

尽管 QML 的初衷是提供与移动设备的接口,但你也可以将其用于桌面应用程序。

此外,你可以使用标准的 JavaScript 来增强你的应用程序,这在与 C++ 结合使用时,可以成为一个有吸引力的基础设施。

Qt Python 和 C++#

对于 Qt for Python 应用程序,你不需要了解 C++,但在某些情况下可以混合使用这两种语言:

  1. 如果你有 Qt/C++ 应用程序,你可以将其改写为 Qt/Python 应用程序。这意味着 Python 旨在完全替代 Qt 应用程序的用户级 C++ 代码。

  2. 对于用 C++ 编写的自定义 Qt 小部件,你可以生成自己的 Python 绑定,以便人们可以直接从 Python 中使用它们。

  3. 如果你有基于 C++ 的库,用于处理特定任务(如高性能进程),并且你在你的 Qt/C++ 应用程序中使用它,你可以为其生成绑定,以便人们能够从 Python 中使用它。

  4. 对于 Qt/C++ 应用程序,你可以通过将主要的 QApplication 单例暴露为 Python 绑定来扩展其功能,从而与 Python 解释器进行连接。这可以被视为你的 Qt/C++ 应用程序的“Python 插件系统”。

对于第 2.、3. 和 4. 步,你需要借助 Shiboken,这是用于生成 Qt for Python 的绑定生成工具。

Qt 兼容哪些 IDE?#

Qt for Python 像任何其他 Python 模块一样,可以在任何与 Python 兼容的集成开发环境(IDE)中使用,但并不是所有的 IDE 都会提供像 Qt Creator 那样的额外功能。

除了编写文件外,你可能还需要执行一些外部步骤来帮助开发你的应用程序:

在终端中:

  • .ui 文件生成 Python 文件:pyside6-uic -i form.ui -o ui_form.py

  • .qrc 文件生成 Python 文件:pyside6-rcc -i resources.qrc -o rc_resources.py

使用命令 pyside6-designer 打开 Qt Widgets Designer 以编辑/创建 .ui 文件。

你最喜欢的 IDE 的外部插件/扩展可能包括运行这些命令或打开外部工具如 Designer 和 QtCreator 的配置步骤。

QtCreator#

你可以在 QtCreator 中基于一些基本模板创建新项目。选择一个模板后,你将经过一些步骤来指定模板的详细信息,比如项目名称、用于界面的基础 Qt 类等。

Visual Studio Code Qt#

除了编辑应用程序的代码外,你还可以使用外部插件来启用更多功能,比如这个非官方插件,你可以在 Visual Studio Code 的快速打开菜单(Ctrl+P)中输入以下命令来安装:ext install seanwu.vscode-qt-for-python

Qt 文件类型#

在开发 Qt for Python 应用程序时,你会接触到许多不同的文件类型,如 .ui.qrc.qml.pyproject 等。在这里你可以找到对每种文件类型的简单解释。

Qt Python 文件 .py#

Python 文件是你在开发 Qt for Python 项目时主要处理的格式。

值得注意的是,你可以仅使用 Python 文件来编写应用程序,而无需 .ui.qrc.qml 文件,然而,使用其他格式将简化一些流程,并为你的应用程序启用新功能。

class MyWidget(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        self.hello = ["Hallo Welt", "你好,世界", "Hei maailma",
            "Hola Mundo", "Привет мир"]

        self.button = QPushButton("Click me!")
        self.text = QLabel("Hello World")
        self.text.setAlignment(Qt.AlignCenter)
        # ...

用户界面定义文件 .ui#

在使用 Qt Widgets Designer 时,你可以使用 WYSIWYG 表单编辑器通过 Qt Widgets 创建用户界面,这个界面以 XML 形式表示为 widget 树。以下是文件开头的摘录:.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">

pyside6-uic 工具可以从这些 .ui 文件生成 Python 代码,你可以从主文件中导入它,因此你无需在部署的应用程序中包含 .ui 文件。

更多详细信息,请参见 使用 Designer 或 QtCreator 的 .ui 文件与 QUiLoader 和 pyside6-uic

资源集合文件 .qrc#

这是一份将与你的应用程序一起使用的二进制文件列表。作为一个基于 XML 的文件,其结构如下:

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
    <file>images/quit.png</file>
    <file>font/myfont.ttf</file>
</qresource>
</RCC>

pyside6-rcc 工具可以从这些 .qrc 文件生成 Python 代码,因此你无需在部署的应用程序中包含列出的文件。

更多详细信息,请参见 使用 .qrc 文件(pyside6-rcc

Qt 建模语言文件 .qml#

图形 QML 应用程序与 Qt Widgets 应用程序无关,这就是为什么通常的 QML 项目设置是一个加载 QML 文件的 Python 文件,以及可选地在 Python 中定义的元素,这些元素被公开给 QML 使用。

你可以手动编写文件,但也可以像嵌入在 Qt Creator 中的 QML Designer 那样使用工具。此外,还有像 Qt Design Studio 这样的商业工具,允许你从其他设计应用程序中加载设计 .qml

在这里你可以找到一个文件示例。代码将显示一个浅灰色矩形,上面有“Hello World!” 消息。

import QtQuick 2.0

Rectangle {
    id: page
    width: 320;
    height: 480
    color: "lightgray"

    Text {
        id: helloText
        text: "Hello world!"
        y: 30
        anchors.horizontalCenter: page.horizontalCenter
        font.pointSize: 24;
        font.bold: true
    }
}

Qt Creator Python 项目文件 .pyproject#

为了让 Qt Creator 加载和处理基于 Python 的项目,需要一个特殊的文件,因为基于 C++ 的项目可以通过或文件来处理,而这些文件不用于基于 Python 的项目。.qmakeCMakeLists.txt

旧版本的 Qt Creator 提供了一种简单的格式,扩展名为 .pyqtc,它们是每行一个文件的纯文本文件:

library/server.py
library/client.py
logger.py
...

这种格式存在一些限制,并且可能添加的进一步选项将不受支持,这就是创建文件的动机,这是一个基于 JSON 的文件,可以添加更多选项。以下是这样一个文件的示例:.pyproject

{
    "files": ["library/server.py", "library/client.py", "logger.py", ...]
}

安装 PySide6#

pip install pyside6

更多参考:qt6-quickstart

import PySide6.QtCore

# 打印 PySide6 版本
print(PySide6.__version__)

# 打印用于编译 PySide6 的 Qt 版本
print(PySide6.QtCore.__version__)
6.8.1
6.8.1