Qtブログ(日本語)

Qt 6.6 リリース

作成者: Qt Group 日本オフィス|Oct 11, 2023 2:57:53 PM

本稿は「Qt 6.6 Released」の抄訳です。

Qt 6 シリーズの第 6 弾がリリースされました。UI とバックエンドの両方の開発をより生産的で楽しいものにするために、大小さまざまな機能が追加されました。いくつかの新機能はテクノロジプレビューとしてリリースされ、次の LTS リリースに向けて最高の状態にできるよう、皆様からのフィードバックをお待ちしています!

UI開発者向けのハイライトから始めましょう。

テクノロジープレビュー:Qt Quick によるレスポンシブレイアウト

Qtで書かれたユーザーインターフェイスは、レイアウトシステムが様々な要素の位置やサイズを調整するという利点があります。その結果、どのような環境でも見栄えのするリサイズ可能な UI が実現できます。しかしこれまでは、例えば利用可能な画面スペースや向きに基づいてレイアウト自体を動的に調整する UI を作成するには、手作業が必要でした。これには、いくつかの要素を非表示にして他の要素を表示したり、レイアウトの一部を置き換えたり、あるいはレイアウト構造を完全に作り直したりする必要があるかもしれません。

 

Qt 6.6では、Qt Quickに新しいレイアウト要素であるLayoutItemProxyを導入します。このプロキシを使用することで、UIデザイナーは通常、ウィンドウのジオメトリプロパティにバインドして異なるレイアウト間を切り替えることができ、プロキシが現在のアクティブなレイアウト構造にUI要素を自動的に配置します。私たちのソリューションについて、他のUIテクノロジーとの比較、およびシステムの設計については、レスポンシブレイアウトのブログ記事をご覧ください。レイアウトのコンテンツをより制御するために、Qt Quick Layoutsは行、列、およびグリッドのレイアウトに均一なセルサイズを実装しました。

Qt Quickモジュールのその他の新機能には、TableViewでの選択モードのサポート、TreeViewでのrootIndexの変更、Flickable要素でのスクロール減速のより細かな制御、およびパスの自動簡略化が含まれます。

テクノロジープレビュー:Qt Graphs

Qt Graphs モジュールは、OpenGL ベースの Qt DataVisualization モジュールと Qt Charts モジュールの機能を 1 つの最新の Qt 6 フレームワークに統合します。Qt Graphs の最初の技術プレビューリリースでは、現在 Qt DataVisualization が提供している機能に焦点を当て、この方向への第一歩を踏み出します。Qt Graphs を使用することで、アプリケーションは、棒グラフ、散布図、面グラフなどの様々な可視化テクニックを使用して、急速に変化する大量のデータを可視化することができます。この実装は Qt 6 のハードウェアレンダリングインタフェースを使用し、Qt Quick 3D の上に配置されています。これにより、すべてのレンダリングはネイティブのグラフィックシステムを使用してハードウェアアクセラレーションされ、3D 視覚化は Qt Quick 3D が提供するシーン管理やインタラクション機能とシームレスに統合されます。

Qt Graphsモジュールは、古いOpenGLベースのQt DataVisualizationおよびQt Chartsモジュールの機能を1つの現代的なQt 6フレームワークに統合します。このQt Graphsの最初のテクノロジープレビューリリースでは、現在Qt DataVisualizationで提供されている機能に焦点を当てて、この方向性に向けて最初のステップを踏み出しています。Qt Graphsを使用することで、棒グラフ、散布グラフやサーフェスグラフなどのさまざまな可視化技術を使用して、大量の急速に変化するデータを視覚化することができます。実装はQt 6のハードウェアレンダリングインターフェースを使用し、Qt Quick 3Dの上に配置されます。これにより、すべてのレンダリングはネイティブのグラフィックシステムを使用してハードウェアアクセラレーションされ、3Dの可視化はQt Quick 3Dが提供するシーン管理およびインタラクション機能とシームレスに統合されます。

このモジュールは活発な開発中であり、すべてのユースケースにおける効果的かつ一貫したデータ管理のためのアーキテクチャと、グラフの高性能なレンダリングアーキテクチャに焦点を当てた研究が行われています。下記動画で、今年の初期のプロトタイプをご覧いただくと、Qtグラフで達成したいことのアイデアが掴めるかと思われます。

Qt Multimedia のウィンドウキャプチャ

Qt 6.5で、Qt Multimediaでのスクリーンキャプチャのサポートを導入しました。Qt 6.6では、この機能を拡張して、アプリケーションが個々のウィンドウをキャプチャできるようにしています。QWindowCapture APIとそのQML相当部分は、キャプチャ可能なウィンドウのリストへのアクセスを提供し、スクリーン共有やウィンドウ共有を実装したいアプリケーションは、簡単にエンドユーザーにウィンドウの選択肢を提供することができます。ウィンドウキャプチャのサポートは、Waylandベースのシステムを除くすべてのデスクトッププラットフォームでFFmpegバックエンドで利用可能です。

QMediaRecorderには、ビデオ品質、解像度、ビットレートを制御する新しいプロパティが追加されました。

Qt GRPC と Qt Protobuf の機能強化

Qt 6.5 でテクノロジープレビューとして Qt GRPC と Qt Protobuf が導入されたのに続き、Qt 6.6 では QtGRPC と QtProtobuf が大幅に強化されました。QGrpcChannelOptions や QGrpcCallOptions などの新しいオプションにより、チャネルやコールの設定がより簡単になりました。これらのオプションは、コールやストリームの最大実行時間を制限するデッドラインメカニズムをサポートするようになりました。新しいQGrpcMetadataでは、クライアントのメタデータを設定したり、サーバーから返されたメタデータを読み込んだりすることができます。新しいリリースでは、QtGRPC は自動生成された QtGRPC クライアントクラスの QML タイプサポートを統合しました。

QtProtobuf では、特定の Qt Core と Qt GUI タイプが *.proto スキーマの一部になりました。QProtobufMessage クラスの暗黙的な共有データにより、QML コンテキストでの効率的なアクセスが可能になりました。google.protobuf.Any 型のサポートが追加されました。さらに、C 言語のunion に似たprotobuf の oneof 型により、データモデリングの柔軟性が向上しました。

プライバシーとセキュリティ設定にアクセスするQt WebEngine API

Qt WebEngine を使用して Web コンテンツをレンダリングするアプリケーションは、API を使用してプライバシーとセキュリティの設定にアクセスできるようになりました。これにより、Chromium ランタイムの動作をより詳細に制御できるようになり、不要な機能を無効にすることができます。たとえば、QWebEngineUrlScheme::FetchApiAllowed フラグを使用して、カスタム URL スキームの HTML5 Fetch API を有効または無効にできます。また、QWebEngineSettings::DisableReadingFromCanvas 属性を使用して、アプリケーションでキャンバスからの読み取りを無効にしてフィンガープリンティングから保護できます。

Qt WebEngine に追加されたもう 1 つの便利な機能は、新しい chrome://qt URL のサポートです。

アプリケーション開発者向けのきめ細かなレンダリング制御

Qt Quick の Font タイプに新しい API が追加され、UI デザイナーは特定の OpenType フォント シェーピング機能を設定できるようになりました。また、Qt Quick Shapes モジュールでは、特殊なフラグメント シェーダを使用して、より高品質なアンチエイリアス レンダリングを行う実験的な曲線レンダラーを使用できるようになりました。

約20倍のスケールでレンダリングされたGhostscriptの虎の歯画像。左から右へ:カーブ・レンダラー、ジオメトリ・レンダラー、マルチサンプリングによるジオメトリ・レンダラー。

Qtのレンダリングハードウェアインターフェース抽象化は、OpenGL、Vulkan、Metal、Direct3Dなどのプラットフォーム固有のレンダリングサブシステムに対して共通の低レベルAPIを提供し、本バージョンではD3D12が利用できるようになりました。Qt 6.6では、QPA APIと同レベルの互換性を持つRHI APIの公開と文書化を開始しました。ソースとバイナリの互換性がない変更は、Qt のマイナーリリース間で発生する可能性がありますが、パッチリリースサイクル内では発生しません。これにより、アプリケーション開発者は、関連するすべてのグラフィックススタックで動作する、低レベルでクロスプラットフォームのコードを書くことができます。

同様の作業は Qt Quick 3D でも進行中であり、将来の Qt リリースではアプリケーション開発者がレンダリングパイプラインを細かく制御できるようになります。Qt 6.6 では、Qt Quick 3D は QML からテクスチャデータとメッシュ形状を手続き型に生成する機能を実装しました。

Qt TextToSpeech:PCM データの生成と、テキストと音声の管理の容易化

Qt 6.4 で Qt TextToSpeech をリリースした後、最も頻繁に寄せられた要望の 1 つは、オーディオデバイスで音声を再生するだけでなく、生成された音声で PCM データを生成できれば、このフレームワークがもっと便利になるというものでした。Qt 6.6 では、この機能を QTextToSpeech::synthesize C++ API に追加しました。この関数をlambdaで呼び出すと、PCMデータを取得してさらに処理することができます。その他の改良点として、テキストセグメントのキューイング制御の改善、マッチする音声を検索するためのクエリーAPI、現在のエンジンでサポートされている機能を確認するためのAPIなどがあります。詳細はブログ記事をご覧ください。

Qt for Python:Asyncioサポート及びツール改善

(別投稿で Qt for Python リリースの詳細を紹介します)
 

Python はコルーチンによる非同期処理をサポートしており、asyncio は対応するキーワードとイベントループの統合のサポートを実装するための最も有名なパッケージです。Qt 6.6 では技術プレビューとして asyncio のサポートが追加され、Qt のイベント処理が asyncio のタスク処理と衝突しないようになりました。

Qt Creator は、既存の仮想環境の検索、追加、更新、ホイールのインストール、新しい Python プロジェクトごとに新しい仮想環境を有効にするようになりました。

Qt Installer のユーザーは、通常の Qt インストールの一部として Qt for Python のホイールをインストールできるようになりました。さらに、商用 Qt for Python ホイールは、新しい qtpip ツールを使って簡単にインストールできます。Qt for Python のホイールをインストールする必要があるユーザーは、qtpip を通常の pip と同じように簡単に使うことができます。

最後に、Qt for Python は AArch64 と互換性があり、Qt for Python は 64 ビットの組み込みシステムで利用できるようになりました。

プラットフォームサポートの更新

Qt for Android は Android 13 をサポートし、デフォルトで AndroidX を使用します。サポートされる SDK のレベルは、Play ストアの要件である 33 になりました。

デスクトップでは、ARM アーキテクチャの Windows と Linux のサポートに取り組んでいます。Qt 6.6 のディストリビューションにはこれらのプラットフォーム向けのバイナリパッケージは含まれていませんが、x86 アーキテクチャ向けと同じプロセスを使用して、これらのプラットフォーム向けに Qt 6.6 をビルドすることができます。Qt 6.7 では、すべてのデスクトップ OS 用の公式 ARM パッケージを提供する予定です。

組み込みシステム向けには、Yocto サポートを最新の「Mickledore」リリースにアップグレードし、多くのハードウェアベンダーと協力して、NXP ボード、Renesas R-Car デバイス、その他様々なプラットフォーム向けのビルド済み Boot2Qt パッケージを提供しています。独自の Qt ボードサポートパッケージを保守しているデバイスメーカーは、Qt のテストがすべて成功することを保証する QBSP テストベンチの改善から恩恵を受けるでしょう。

Debian プロジェクトとの共同作業を継続し、新しい Qt 6 メンテナグループを結成しました。この協力のおかげで、Debian 11 と Debian 12 用の Qt 6 パッケージが通常のディストリビューションリポジトリから入手できるようになりました。商用 Qt 6.6 パッケージは、The Qt Company がホストする Debian リポジトリから入手できます。そのため、Debian ベースの Linux システムを使用している商用およびオープンソースのユーザは、通常の apt-get ワークフローを使用して Qt インストールを保守できるようになりました。これには、Raspberry Pi 4 のような Debian や Ubuntu ディストリビューションをネイティブに使用する組み込みボードも含まれます。

大きな改善を生む小さな変更

上記は主な新機能のリストですが、他のマイナーリリースと同様に、Qt 6.6 では既存のクラスやツールに多くの小さな改良が加えられています。

パーミッション API は QML から利用できるようになり、QWidget はフォーカスチェーン全体を一度に設定する便利なオーバーロードを持ち、Qt コンテナは既存のペイロードをメモリ割り当てなしで置き換える assign() オーバーロードを持ちました。持続時間を操作する Qt API の多くに std::chrono のオーバーロードが追加され、10 秒の即値でタイマーを開始できるようになりました。同様に、タイムスタンプを扱う多くの API に QTimeZone を受け取るオーバーロードが追加されました。

Qt Sql モジュールでは、Mimer SQL 社からデータベースバックエンド用のプラグインが提供され、MySQL・MariaDB ドライバに新しい接続オプションが追加されました。

カスタムまたはプラットフォーム固有のクリップボード形式は、macOS と Windows 用の新しいコンバータクラスを使って実装できます。また、Qt PDF モジュールでは、リンクへのアクセス、ページサムネイルの取得、ページ選択のための便利なクラスが提供されています。

WebAssembly プラットフォームをターゲットとする開発者は、動的リンクのサポートと QtLoader の改善により、より速い開発サイクル、より簡単なデバッグ、より良いメンテナンスを楽しむことができます。私たちは、共有 Qt ライブラリやプラグインでアプリケーションを実運用にデプロイできるように、ダイナミックリンクのサポートを強化する作業を続けています。

コンパイルされた QML のソースコードをアプリケーションのバイナリに含める必要がなくなり、QML リンターはカスタムルールの拡張をサポートしています。QML language serverの開発は現在進行中であり、Qt Creator や Visual Studio Code などの言語サーバープロトコルをサポートする IDE での QML 開発者の体験を向上させる大きなステップとなるでしょう。

謝辞

Qt 6.6 の実現に協力してくれたすべての貢献者に感謝します。リリースノートの最後に、Qt コードにパッチを提供してくれたコミュニティメンバーの完全なリストがあります。また、バグを報告してくれたり、フィードバックを送ってくれたり、使用例について教えてくれたりして、Qt をより良い製品にするために貢献してくれたすべての方に感謝します。最後になりましたが、このバージョンのリリースに関わったすべての人に感謝します!

いつものように、新しいリリースは Qt インストーラで入手できます。また、QtのダウンロードページQt アカウントページ、そして前述のように Debian のリポジトリからもリリースを入手できます。