Qt for Python 6.8:现已发布!

作者:Cristián Maureira-Fredes | Nov 18, 2024 2:48:23 AM

我们非常高兴地宣布 Qt for Python 6.8 的最新发布。每发布一个新版本,我们都会尝试利用 Qt 的新功能和新的流行理念带来新的惊喜。为方便起见,您可以查看 Qt for Python 6.8 中的新功能和改进功能,以及整个变更日志 

在每个版本中,Qt for Python 团队都努力在错误修复、功能开发和全新想法之间取得良好的平衡。在此版本中,您将看到一些与改进我们当前产品相关的更改,例如更改 Python 可调用的信号连接,为移除 Python 的 GIL 做准备,扩展对懒加载的支持以包括智能指针和嵌套类型,以及其他一些小的修复。

我们想重点介绍团队投入时间最多的几项主要任务。

Qt设计工作室兼容性

您听说了吗?您现在可以使用 Python 后端轻松运行 QtDS 项目了! 

如果您还没有了解,请查看 我们之前的博文,其中介绍了 QtDS 中的新导出功能,以及新的PySide6_DS包,其中包含了专属的QtQuick组件。此外,您还可以使用 pyside6-deploy 部署带有 Python 后端的 Design Studio 项目。导出项目后,只需使用安装了 PySide6 的 Python 环境,在导出的项目中运行以下命令即可:

pyside6-deploy Python/main.py

减少二进制文件大小

封装 Qt 库可能会在性能方面带来开销,还会影响安装的大小。在此版本中,我们将二进制大小减少了约 10%,但我们相信还有更大的可能,因此我们仍在致力于此项工作。

换个角度来看,对于 Linux 上的 QtCore,Qt 二进制文件约为 6.8 MB,封装二进制文件约为 4.4 MB。这意味着,如果您要使用 PySide 中的 QtCore,大约需要 11.2 MB,考虑到应用程序的部署,这可能是嵌入式系统甚至桌面应用程序的一个问题。

我们注意到一些字符串可以被压缩,其他字符串甚至可以被移除,但我们仍在努力将大小进一步缩小,并设法为 Qt 二进制文件提供一个轻量级封装。

改进我们的 Python 存根(类型提示)

一些系统性的问题来自 Shiboken 类型系统中一些 dunder 方法的返回类型,它们使用了通用的 PyObject* 而不是 str。在某些情况下,mypy 无法处理重载链中不一致的静态方法。

大部分更新的文件都是我们的示例和教程,其中mypy需要几个小版本之前引入的新枚举才能正确处理这些代码行,即使我们出于兼容性目的而设置了容错模式(例如,我们应该使用Qt.Orientation.Horizonal,,而不是 Qt.Horizontal)。

许多关于输入的旧Bug也得到了修复,但在未来的版本中仍有一些问题需要解决。

动态绑定研究

在过去的几个月中,我们一直在研究简化绑定生成过程的方法,更确切地说,是依靠 QMetaObject 为 QObject 提供 Python 动态绑定。这包括使用 QMetaType 转换函数参数类型的机制,以及使用自定义转换器扩展其他类型的机制。

这是一个棘手的主题,您需要从 Qt 方面、CPython 方面以及 C++ 方面解决许多细节问题,因此您可以理解,找到适当的平衡可能具有挑战性。

需要做更多工作的一个特定主题是对象所有权的概念,我们已经通过 Shiboken 解决了这个问题,但这个项目是全新的。我们可以重用其中的一些逻辑,但我们希望避免与当前的产品过于紧密。

我们希望很快在后续博客中讨论这一主题,主要是因为它提供了一种更简单的方法来在 Qt/C++ 应用程序中启用脚本功能。

PySide6 Flatpak Baseapp介绍  

虽然不是 6.8 版独有,但我们一直在努力开发 PySide6 的 Flatpak baseapp。这将使 PySide6 Linux 开发人员能够毫不费力地 使用 PySide6 创建 Flatpak 应用程序。 

基于强大的KDE SDK构建,baseapp预装了PySide6库,使开发比以往任何时候都更加顺畅。

目前,baseapp只支持PySide6 6.7.3,并且可以在Flathub上随时可用。一旦KDE运行时将Qt版本更新到6.8.0后,baseapp将立即更新到PySide6 6.8.0。

要开始使用,只需运行以下命令: 

  flatpak install flathub io.qt.PySide6.BaseApp//6.7 

有关使用 baseapp 创建自己的 PySide6 应用程序的深入指南,请查看 KDE 开发人员文档中的精彩教程:  https://develop.kde.org/docs/getting-started/python/ 

适用于 PySide6 的 Android Wheels 

随着 PySide6 6.8 的发布,您现在可以下载 PySide6 的 Android 轮(预构建的组件和库),它与 `pyside6-android-deploy` CLI 工具无缝集成。这使得为 Android 架构打包 PySide6 应用程序变得更加容易。在此之前,开发人员必须自己完成交叉编译 Android PySide6 二进制文件的繁琐过程。这通常被证明是一项具有挑战性且耗时的任务。但是现在,有了预构建的 PySide6 Android 轮子,这一过程将比以往任何时候都更加简化和方便。

要开始使用,您可以从 Qt for Python 官方发布页面下载 Android 轮子:https://download.qt.io/official_releases/QtForPython/pyside6/

另外,您可以使用即将发布(0.1.4)的 qtpip 直接下载轮子。 

qtpip download PySide6 --android --arch aarch64   

可以下载 aarch64 轮子,或x86_64 轮子 

qtpip 将输出下载轮子的路径,然后您可以使用 `pyside6-android-deploy` 工具打包您的 PySide6 Android 应用程序。 

pyside6-android-deploy--wheel-pyside=<path_to_pyside6_wheel>--wheel-shiboken=<;path_too_shiboken_wheel> --name <application_name> --ndk-path=<downloaded_ndk_path> --sdk-path=<downloaded_sdk_path>

要了解如何使用 pyside6-android-deploy,请参阅 官方文档 

新工具:pyside6-svgtoqml 

PySide6对应于svgtoqml工具,可用于将SVG文档转换为QML文件,以便在QtQuick应用程序中使用。 

pyside6-svgtoqml <svg_file_to_read> <qml_file_to_write> 

未来计划

在接下来的版本中,我们将专注于改进现有产品,但同时我们也将在工具方面投入更多精力,以简化 PySide 开发人员的编程决策,同时我们也将探索与 Python 交互的新方式。

关于最后一个主题,我们一直在研究一些简化 Qt 和 Python 开发的方法,主要是为了在编写简单应用程序时减少模板代码的数量,同时也是为了提供一种更加独立的机制来为 UI 添加逻辑。

让我们保持联系!

我们希望继续尝试新的实验支持、功能和 Python 模块集成。我们下一步应该做什么?请给我们留言或在 JIRA提交建议 👍。

我们希望您喜欢该版本,并一如既往地访问我们的社区平台。如果某些功能无法正常工作,请提交打开错误报告告知我们。