qt
简介#
qt
为兼容 Qt5 和 Qt6 提供了统一接口。由于 PySide6
更加 Pythonic,故而着重致力于集成 PySide6
,其他 Qt 模块可能支持不完善。
备注
先导学习资料见我的简书:
Qt 官方文档:
Qt for Python 提供了 Qt 的官方 Python 绑定,使您能够使用 Python 编写 Qt 应用程序。该项目主要包含两个组件:
Qt、QML、Widgets 它们之间有什么区别?#
请记住,Qt 最初是作为 C++ 框架用 C++ 设计和编写的,你会发现许多引用、示例和概念在基于 C++ 的应用程序中是有意义的,这些可能在你的 Python 应用程序中并不相关。但请记住,Qt for Python 的目标是将 Qt 框架暴露给 Python,并进行了许多适配。使用 Qt for Python 不需要了解 C++,稍后你可以找到这些语言之间的所有可能组合。
Qt#
Qt 项目是开放的协作平台,负责协调 Qt 框架的开发。你可能会遇到“Qt”既指代项目本身,也指代框架的情况。
作为框架,Qt 有许多组件,这些组件通过模块和库进行分发,例如,qtbase
是基础组件,包含许多模块,如 QtCore
、QtGui
、QtWidgets
、QtNetwork
等。所有这些模块都包含许多可以直接使用的类,比如 QtCore
中的类,你可以找到像 QFile
、QTime
、QByteArray
等类。
你可以使用这些类创建没有用户界面的应用程序,例如命令行应用程序、处理文件、网络连接、正则表达式、文本编码等。
另一方面,你可以使用 QtWidgets
模块中的类创建图形化应用程序,这也被称为 Widgets
。
还有许多其他 Qt 模块,如 QtMultimedia
、QtCharts
、Qt3D
等。这些模块具有特定的功能,其中名为 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++,但在某些情况下可以混合使用这两种语言:
如果你有 Qt/C++ 应用程序,你可以将其改写为 Qt/Python 应用程序。这意味着 Python 旨在完全替代 Qt 应用程序的用户级 C++ 代码。
对于用 C++ 编写的自定义 Qt 小部件,你可以生成自己的 Python 绑定,以便人们可以直接从 Python 中使用它们。
如果你有基于 C++ 的库,用于处理特定任务(如高性能进程),并且你在你的 Qt/C++ 应用程序中使用它,你可以为其生成绑定,以便人们能够从 Python 中使用它。
对于 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