Qt for Python: 最新リリース6.6の全詳細

qt_for_python_6_6_header

本記事は「Qt for Python: all the details of the latest 6.6 release」の抄訳です。

Qt 6.6リリースにより、プロジェクトはQtの提供するすべての新機能とモジュールを提供することができるようになりました。しかし、いつものように、Pythonエコシステム周りの追加機能を提供し、ツールの改善も行いました。

6.5リリースのアナウンスを覚えているかもしれませんが、今回は前回のリリースで説明したすべての初期サポートの改善に多くの時間を費やしました。

変更の詳細を確認するには、こちらの変更ログをご覧ください。しかし、新機能の要約を知りたい場合は、この投稿を読み続けてください。

Qt/C++に追いつくために 

各リリースのたびに、Qt for Pythonチームが行っている作業のほとんどは、Qt APIの変更に追いつくことですが、同時に最新のC++規格も考慮しています。これにより、Qt/C++が提供する同じ(または似た)機能セットを提供できるようにしています。

shibokenコードジェネレータは、より高度なC++構造に対応するために更新されました。たとえば、rvalue参照を使用して関数を宣言することができるようになりました。

さらに、より多くの変換演算子(int、double)のサポートが追加されました。これらはPythonの該当する演算子 (__int__、__float__) に変換されます。スマートポインタの__repr__関数とdir関数も拡張され、ポインタ先に関する情報を含むようになりました。

Python 3.12 サポート

ご存知の通り、Python 3.12は10月2日以降にリリースされており、そのバージョンをサポートするためにすでに取り組み始めています。

現時点では、大きな問題なく使用することができますが、新たなコーナーケースの不具合が発生する可能性があります。ご報告いただければ、より良いサポートを提供できますので、ぜひお知らせください。

Python 3.12ではtp_dictフィールドのPyTypeObjectがオプショナルになりました。このフィールドに依存することは、CPythonの開発者が期待していない(推奨していない)ことは分かっていますが、私たちの目的には十分でした!幸運なことに、新しい内部メソッド PyType_GetDict を使うように実装を変更することができましたが、残念ながら安定版 ABI には含まれていません。

Python 3.7 はサポートされなくなりました

以前にもお伝えしましたが、5つ以上のPythonバージョンのサポートを行わないことを決定しましたので、3.12のサポートに注力するということは、Qt 6.6以降では3.7のサポートが行われないことを意味します。

今年の6月末でPython 3.7はサポート終了しましたので、もし3.7に縛られている場合は、より新しいバージョンに移行することを強くお勧めします。

PySideの新しいモジュール 

QtGraphsモジュールが追加され、Qt 6.6の新機能と同じレベルになりました。このモジュールは、Qt Data Visualizationを置き換えることを目指しており、内部実装を改善し、OpenGLの使用をQuick3D APIに置き換えることで、Quick3Dのエフェクトの使用ができるようになります。

ただし、現時点では技術的なプレビューです。APIは6.7で変更される可能性があります。

ShibokenジェネレータがPyPIで利用可能

ShibokenジェネレーターをPyPIで利用しなかった主な理由は、libclangへの依存性です。これは、Qt for Pythonプロジェクトでは以前にすべてを含んだ1つの大きなホイールを使用していた時代から来ています。

ホイールを分割した際、大きなモジュールをスキップできるようにするために、libclangを含めたshibokenジェネレーターホイールはあまり大きくありませんでしたが、以前のリリースでは一部のユーザーが要求したため、それを保持していました。したがって、ついにPyPIに更新しました。これにより、お気に入りのC++プロジェクトにPythonバインディングを生成するための実行可能ファイルを取得するために、pip install shiboken6_generatorを使用することができます。

PySideのasyncio対応 

6.5のリリースサイクルから、そして今回の6.6でも、私たちはasyncioとQtの相互運用性に取り組んできました。ご存じの通り、asyncioはイベントループをカスタム実装で置き換えることができ、私たちはまさにそのカスタム実装を行ってきました。これにより、asyncio APIを使用し、asyncioまたはasyncioに基づくフレームワークを使用するプログラムを実行できます。同時に、Qtのイベントループが重要な役割を果たしています。なぜQtのイベントループを利用するのでしょうか?なぜなら、これによりasyncioの利点であるasync/await構文を活用しながら、Qt API全体がasyncioの利用可能になるからです。今回の6.6サイクルの最初のリリースでは、このイベントループの実装のテクニカルプレビューを提供しています。これにより、futureやtask、handleを作成し、イベントループのライフサイクルを管理することができます。今後のマイナーリリースで、イベントループAPIの幅広いカバレッジが構築される予定です。Qtのイベントループを使用するには、コードに次の2行を追加するだけです。

from PySide6.QtAsyncio import QAsyncioEventLoopPolicy

asyncio.set_event_loop_policy(QAsyncioEventLoopPolicy())

これを実際に見てみたい場合は、以前利用可能だったasyncioのサンプルもこの新しい方法に対応するように更新されています。Eratosthenes及びMinimalのサンプルです。

これからもさらに多くのアップデートが予定されており、皆さんのフィードバックを大切にしています!ご意見をお聞かせください。また、発見したバグについてもご遠慮なく報告してください。

Android互換性の向上 

6.5では、ツールpyside6-android-deployを導入することで、Androidデプロイメントの最小限のサポートのテクニカルプレビューを公開しました。6.6では、多くの更新がありますが、pyside6-android-deployはまだテクニカルプレビューのままです。なぜなら、python-for-androidのカスタムフォークがまだアップストリームにマージされていないからです。また、ツールはもう少しのテストが必要です。Qt では、ユーザーに完璧なエクスペリエンスを提供したいと考えています。「テクニカルプレビュー」タグはすぐに外せるでしょう。

Androidサポートの主な改善点は以下の通りです。

  1. 6.5 では、pyside6-android-deploy は Qt モジュールのサブセットのみをサポートしていました(注意点を参照)。6.6では、Androidプラットフォームで利用可能なすべてのQtモジュールをサポートしています。つまり、Qt Multimedia、Qt Bluetooth、Qt Locationなどを利用するPySide6アプリケーションをAndroidにデプロイできるようになります。このツールは自動的にすべての依存関係を特定し、生成された apk にそれらをパッケージ化します。
  2. 6.5では、Android NDKとSDKを手動でダウンロードし、それらを使ってAndroid PySide6ホイールを作成することが前提条件でした。これは自動化され、Androidホイールを作成するために使用されるクロスコンパイルスクリプトを使用してダウンロードできるようになりました。このスクリプトはQt for Pythonのpyside-setup/tools/cross_compile_android/main.pyにあります。6.5では必須だった--ndk-path--sdk-pathオプションは、6.6では任意になりました。スクリプトはサポートされているAndroid NDKとSDKを、ユーザのホームディレクトリにあるpyside6-android-deployというキャッシュにダウンロードします。pyside6-android-deployツールはまた、利用可能であればこのキャッシュからAndroid NDKとSDKを使用し、そうでなければpython-for-androidへの簡単なインタフェースを提供するKivyのツールであるbuildozerによって提供されるものをデフォルトとします。
  3. 6.5でQtに導入された新しいパーミッションAPIは、PySide 6.6でAndroidのデプロイに利用できるようになりました。PySide6の以下のサンプルは、Androidにデプロイするときにこの新しいAPIを考慮するようにすでに適応されています。

現在、ほとんどのサンプルはAndroidで動作していますが、その多くはまだデスクトップアプリケーションのUIに似ています。今後のリリースでは、Androidデバイスに特化した例が増えることを期待できます。

注:クロスコンパイルの欠点により、AndroidのデプロイはLinuxホストからのみ動作します。 

新しいターゲットプラットフォーム: aarch64 の追加

少し前に、組み込みプラットフォームの研究を始めることにしました。Raspberry Piデバイス用にプロジェクトのクロスコンパイルを可能にしたことを覚えているかもしれません。

これらのデバイスの後、互換性を他のシステムにも拡張したかったのですが、sysroot構造やバージョン、その他多くの詳細を適切に扱うのは簡単な作業ではないことがわかりました。そこで、エンドユーザがプロジェクト全体をクロスコンパイルする必要がないように、互換性のあるホイールを生成することにしました。

PySide 6.6 は aarch64 ホイールを含む最初のリリースになります。つまり、Raspberry Pi のような組み込みデバイスでは、pip install pyside6 を実行して最新のリリースを取得できます。

クロスコンパイルのインフラストラクチャはまだ存在しており、まだ利用される方ために維持続けます。

商用ホイールへのアクセス向上 

Python の開発者は、プロジェクトの依存関係を PyPI のような URL インデックスに依存しています。しかし、独自のパッケージを保持したり、例外的なケースでプロジェクトを構築しようとして、異なるインデックスやセルフホストインデックスを使うことになるユースケースもあります。

多くのライセンス所有者が https://account.qt.io から Qt for Python ホイールを入手するのに少し苦労していることに気づいたので、様々な点から状況を改善することにしました。

メンテナンスツール

Qt ライセンスをお持ちの方は、メンテナンスツールのインターフェイスで、異なるバージョンの Qt for Python を選択して、ホイールをローカルにダウンロードできるようになりました(インストールはできません)。

p1

インストールを行わない動機は、Pythonプロジェクトは通常、プロジェクトのために特定の設定で仮想環境を作成するため、このプロセスをインタプリタの選択に限定することは最適ではなかったからです。ローカルホイールの利用では、ユーザはどの仮想環境からでもインストールできます。

p2

Qt-pip

Pip は Python 環境にモジュールをインストールするために使用できるデフォルトのパッケージマネージャです。商用ユーザーにとっては、PyPI リポジトリの性質上、これは利用不可能でした。そこで、私たちはこのツールを Maintenace Tool のロジックでラッピングし、Qt のライセンスを確認し、利用可能な商用パッケージを提供するシンプルなコマンドラインツールを作成することにしました。

このプロジェクトは Qt for Pythonのリリースから独立しているため、詳細とインストール方法については、別ブログ記事で紹介します。

より良いPython IDEを目指すQt Creator 

p3

Qt Creator チームはここしばらくの間 Python サポートを改善してきました。リリースサイクルは Qt のリリースサイクルとは関係ありませんが、Qt Creator が現在持っているものをいくつか紹介したいと思います。

  • Python プロジェクトのテンプレートが調整され、さらに追加する予定です(アイデアをお持ちの方はお知らせください)
  • インタプリタの選択が改善されました
  • プロジェクトウィザードを使って新しいプロジェクトの仮想環境を作成できるようになりました
  • 既に仮想環境がある場合は、自動で仮想環境を検出します
  • PySide6 がインストールされていない場合、Qt Creator はパッケージのインストールを提案します
  • 商用ユーザで、Maintenace Toolによって提供されたホイールを持っていれば、Qt Creatorはそれらをインストールすることができます

他にも考えている機能がありますが、ぜひご連絡ください。

動的バインディングの研究 

Qtの上でPython APIを提供するだけでは不十分だと考えています。

過去の講演では、C++アプリケーションにPythonインタプリタを導入し、C++の中でPython式を評価できるようにする最初の試みをご覧になったかもしれません。このアイデアを少し繰り返し、動的バインディングという同じような問題に取り組むことにしました。

現在、Qt 5 で JavaScript の動的バインディングを提供した QtScript モジュールの後継を研究しています。新しいモジュールは、shibokenジェネレーターを実行することなくPythonの動的バインディングを提供するはずです。これにより、C++ライブラリをベースにしたPythonモジュールの開発が高速化されることは間違いありませんが、より重要なことは、多くの人がC++ライブラリをPythonのエコシステムに持ち込みを促進することです。

今後について

新しい実験的サポート、機能、Pythonモジュールの統合を試し続けたいと思っています。次は何をしましょうか?私たちにメッセージを送るか、JIRA で提案をしてください。

そして、いつものように、コミュニティプラットフォームにお立ち寄り、何かが正しく動作していない場合は、JIRA でバグレポートを作成してお知らせください。


Blog Topics:

Comments