Qt for Python 6.8がリリースされました

本稿は「Qt for Python release: 6.8 is out now!」の抄訳です。
 

Qt for Python 6.8の最新リリースをお知らせいたします。各リリースにおいて、Qtの新機能やトレンドに合わせた革新的な要素を導入することを心掛けています。新バージョンでの変更点および改善点については、完全な変更ログとともにご確認いただけます。

各リリースにおいて、Qt for Pythonチームはバグ修正、機能開発、そしてまったく新しいアイデアのバランスをうまく取って作業を進めています。今回のリリースでは、Python GILの廃止に備えたPython callableのsignal接続の変更、スマートポインタやネストされた型を含むレイジーローディングのサポート拡張、そしてその他のいくつかの軽微な修正など、現在の提供物の改善に関連するいくつかの変更が確認できるでしょう。

本記事で、チームが最も時間を費やした主な作業のいくつかを強調したいと思います。

Qt Design Studio 互換性

ご存知でしたか? Qt Design Studio (Qt DS) プロジェクトをPythonバックエンドで簡単に実行できるようになりました。

まだご存知でない方は、Qt DSの新しいエクスポート機能と、アドホックなQtQuickコンポーネントを含む新しいPySide6_DSパッケージに関する以前のブログ記事をご覧ください。さらに、pyside6-deployを使用して、Pythonバックエンドを持つ Qt DS プロジェクトを展開することが可能です。プロジェクトをエクスポートした後、PySide6がインストールされたPython環境内で、エクスポートされたプロジェクトから次のコマンドを実行してください。

pyside6-deploy Python/main.py

バイナリサイズの削減

Qtライブラリのラッピングは、パフォーマンスの面でオーバーヘッドをもたらす可能性がありますが、インストールサイズにも関連します。今回のリリースでは、バイナリサイズを約10%削減していますが、さらに削減できる余地があると考えており、現在も作業を続けています。

状況を整理すると、Linux上のQt Coreでは、Qtバイナリは約6.8MB、ラッパーバイナリは4.4MBです。つまり、PySideからQtCoreを使用するには、約11.2MBが必要であり、アプリケーションの展開を考慮すると、これは組み込みシステム、あるいはデスクトップアプリケーションでも問題となる可能性があります。

いくつかの文字列は圧縮でき、また、削除できるものもあることに気づきましたが、まだサイズをもう少し小さくする作業を行っており、Qtバイナリ用の軽量ラッパーを提供できるよう努力しています。

Pythonスタブ(型ヒント)の改善

Shibokenの型システムにおけるいくつかのdunderメソッドの戻り値の型に、strではなく汎用的なPyObject* が使用されていたため、いくつかの体系的な問題が発生しました。また、mypyはオーバーロードチェーンにおける一貫性のない静的メソッドを処理できない場合がありました。

更新されたファイルのほとんどは、以前のマイナーバージョンで導入された新しい列挙型を使用しているサンプルやチュートリアルで、互換性を保つために用意されている許容モード(例えば、Qt.HorizontalではなくQt.Orientation.Horizontalを使用すべきである)を使用しても、mypyがこれらの行を適切に処理するには、新しい列挙型が必要となります。

型付けに関する多くの古いバグも修正されましたが、今後のリリースでまだいくつか対応すべきことがあります。

動的バインディングに関する研究

ここ数ヶ月間、バインディング生成プロセスを簡素化する方法、より正確に言えば、QMetaObjectに依存してQObjects用のPythonダイナミックバインディングを提供する方法を研究してきました。これには、QMetaTypeを使用して関数引数の型を変換する仕組みや、他の型用のカスタムコンバータでそれらを拡張する仕組みも含まれます。

これは難しいトピックであり、Qt側、CPython側、C++側で解決しなければならない多くの詳細があります。そのため、適切なバランスを見つけるのは難しいかもしれません。

より多くの作業が必要な具体的なトピックの1つは、オブジェクトの所有権に関する考え方です。これはすでに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 Wheel 

PySide6 6.8 のリリースに伴い、pyside6-android-deploy の CLI ツールとシームレスに統合する PySide6 の Android ホイールをダウンロードできるようになりました。これにより、PySide6 アプリケーションを Android アーキテクチャ向けにパッケージ化するのがより簡単になります。以前は、開発者は Android PySide6 バイナリのクロスコンパイルという面倒なステップを自分自身で実行しなければなりませんでした。これは、しばしば困難で時間のかかる作業でした。しかし、現在では事前ビルドされた PySide6 Android ホイールが利用可能になったため、プロセスが合理化され、これまで以上に利用しやすくなりました。

まず、Qt for Python の公式リリースページから Android ホイールをダウンロードします。

https://download.qt.io/official_releases/QtForPython/pyside6/

または、まもなくリリースされる予定の qtpip バージョン 0.1.4 を使用してホイールを直接ダウンロードすることもできます。

aarch64 ホイール用は以下の通りです。 

qtpip download PySide6 --android --arch aarch64   

x86_64 ホイール用にも同様に利用可能です。

qtpipはダウンロードしたwheelsへのパスを出力します。このパスを pyside6-android-deploy ツールで使用して、PySide6アプリケーションをAndroid向けにパッケージ化することができます。

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

pyside6-android-deploy の使用方法については、公式ドキュメントを参照してください。

新しいツール: pyside6-svgtoqml

svgtoqmlツールのPySide6版で、SVGドキュメントをQtQuickアプリケーションで使用できるQMLファイルに変換するのに使用できます。

pyside6-svgtoqml <svg_file_to_read> <qml_file_to_write> 

今後の計画

今後のリリースでは、現在の提供物の改善に注力したいと考えていますが、同時に PySide 開発者のプログラミングの判断をより簡単にできるよう、ツールの改良にも取り組んでいきます。また、Python との新しい連携方法も模索していきます。

最後のトピックについてですが、QtとPythonの開発を簡素化するいくつかの方法を研究しています。主に、シンプルなアプリケーションを書く際に、定型的なコードの量を減らすことを目的としていますが、UIにロジックを追加するためのより独立した仕組みを提供することも目的としています。

ご連絡をお待ちしております

新しい実験的なサポート、機能、Pythonモジュール統合等を継続的に試していきたいと考えています。次に何をすべきでしょうか?メッセージをお送りいただくか、JIRAで提案してください。

リリースをお楽しみいただければ幸いです。また、いつも通り、当社のコミュニティプラットフォームにアクセスし、うまく動作しない点があれば、バグレポートを作成して当社にお知らせください。 


Blog Topics:

Comments