Qt Frameworkのバージョン6.11がリリースされました。パフォーマンスの向上に加え、グラフィックス、接続性、言語に関する新たな技術や機能がサポートされているほか、非同期C++コーディングに対する新たな手法も導入されています。ぜひ詳しくご覧ください。
ハイライトのビデオをご覧ください
埋め込み動画が表示されない場合は、YouTubeで発表動画を視聴できます。
2Dレンダリングのパフォーマンスと生産性向上:Qt Canvas Painter
今回のリリースでは、Qt を使用した 2D グラフィックス作成のための新しいモダンなアプローチ、Qt Canvas Painter が導入されました。この新しいモジュールは 2D グラフィックスレンダリング機能を備えており、Qt の Rendering Hardware Interface (RHI) を基盤として構築されています。ハードウェアアクセラレーションにより、UI グラフィックスのパフォーマンスが大幅に向上し、ベンチマークでは以前の QPainter OpenGL バックエンドモジュールと比較して著しい速度向上が確認されています。
Qt Canvas Painter は、おなじみの HTML Canvas 2D コンテキストに準拠しており、すぐに簡単に使い始めることができ、最初から生産性を高めることができます。
パフォーマンスと生産性の向上に加え、この新しいモジュールはさまざまな高度な機能を提供します。これには、調整可能なアンチエイリアシング、ボックスグラデーションやシャドウ、グリッドパターン、カスタムシェーダーブラシやカラーエフェクトなどが含まれ、モダンで視覚的に豊かなUIや、効率的なGPU駆動の描画ワークフローをサポートします。
詳細については、この1分間のティーザー動画をご覧ください。
さらに詳しく知りたい方は、以下のブログシリーズをご覧ください。
トップクラスの3Dフレームワーク、さらなる進化
Qtは進化を遂げ、ゲームエンジンと同等の3D機能を提供しつつ、一貫した高いパフォーマンスを実現するようになりました。つまり、Qt Quick 3Dを使用したUIは、複雑な要素やエフェクト、アニメーションがあってもスムーズに動作します。
新しいリアルタイムレンダリング技術:SSGI、SSR、およびモーションベクトル
Qt 6.10では、光と静的オブジェクトとの相互作用を扱う技術であるライトマップのベイク処理が改善されましたが、6.11リリースでは、これに代わる動的な手法が導入されました。SSGI(Screen Space Global Illumination)は、画面上の表面で光がどのように反射するかをシミュレートするレンダリング技術であり、ポストプロセス効果としてリアルタイムの変化に対応します。ただし、SSGIには一定のパフォーマンスコストが伴うため、リソースに制約のあるターゲットではライトマップベイクを、特にパフォーマンスへの要求がそれほど高くないアプリケーションにおけるリッチな3D UIではSSGIを採用することが推奨されます。

6.11で新たに追加されたもう1つのリアルタイムレンダリング技術が、SSR(Screen Space Reflections)です。SSGIと同様に、画面上に表示されているものを利用しますが、反射をレンダリングするために、各ピクセルを「レイマーチング」し、それに応じて反射を計算します。
さらに、Qt Quick 3D では、SceneEnvironment および ExtendedSceneEnvironment といった型を通じて、3D オブジェクトのアンチエイリアス処理を行うためのさまざまな手法をサポートしています。特に、動いているオブジェクトのギザギザ感を軽減する上で、時間的アンチエイリアシングとモーションブラーは注目すべき機能です。Qt 6.11 では、オブジェクトごとのモーションベクトルの生成機能を追加しました。これにより、計算コストと出力精度のバランスが極めて良好なものとなっています。
高度なレンダリング・パスのカスタマイズ
高度な視覚効果、パフォーマンスの最適化、または独自の技術の統合が必要で、デフォルトのレンダリング・パイプラインを超える機能を求めるユーザーのために、Qt Quick 3Dではレンダリング・パスをカスタマイズするオプションが提供されるようになりました。レイヤーとタグのための新しいAPIにより、レンダリング・パイプラインの各部分にどのアイテムを含めるかを指定したり、それらを異なるレンダリング・ターゲットに割り当てたり、個々のレンダリング・パスを制御したりすることが可能になりました。既存のマテリアルを使用したり、追加のシェーダーでマテリアルを拡張したり、マテリアルの特定の側面を上書きしたりできます。これらの新しい柔軟性はすべて、QMLから直接利用可能です。
Qt 6.11のQt Quick 3Dで何ができるか、その他の例をご覧になりたい場合は、こちらをご覧ください。
グラフの作成と操作の新しい方法
グラフに関する新しいQtサンプル「Wind Turbine Dashboard」をご紹介します。このサンプルでは、シンプルな2D表示から複雑な3Dグラフまで、データ可視化をいかに柔軟に作成・組み合わせることができるかを実演しています。また、グラフの外観、ラベル、ユーザー操作など、あらゆる面で高度なカスタマイズが可能です。

QtのサンプルにあるWind Turbine Dashboard をお試しください(Qt Graphsモジュールがインストールされていることを確認してください)。
この新しい例では、3Dグラフが複数の軸に対応していることがわかります。QBar3DSeriesのrowAxis、valueAxis、columnAxisプロパティ、またはQScatter3DSeriesおよびQSurface3DSeriesのaxisX、axisY、axisZプロパティに対して、異なる軸インスタンスを使用してください。Qt Graphs モジュールの各要素にいくつかの新しいプロパティを追加し、グラフの描画方法をより細かく制御できるようにしました。個々の軸のテーマカラーやエリアグラフのグラデーションのオーバーライドから、折れ線グラフの線、ストローク、および結合スタイルまで、幅広く対応しています。Bar3DSeriesのラベルはより柔軟にカスタマイズおよび配置が可能になり、QDateTimeAxisはタイムゾーンを受け入れ、パンやズームが可能になりました。また、QSplineSeries::optimizedやGraphsItem3D.cutoffMarginなどのプロパティにより、さらに微調整が可能になりました。
それでもまだ物足りない場合は、新しいCustomSeriesタイプを使用することで、ユーザー定義のデリゲートが各データポイントをレンダリングする、完全にカスタムなグラフを実装することができます。
非同期コーディングへの宣言型記述法:Qt TaskTree
Qt TaskTreeは、Qt 6.11でテクノロジープレビューとして提供されている新しいモジュールです。
Qt TaskTreeは、C++に宣言型記述の手法を導入することで、QtのAPI設計に全く新しい視点をもたらします。非同期ワークフローは、レシピと呼ばれる再利用可能なオブジェクトをタスクツリーに渡すことで宣言的な記述として表現され、タスクツリーはそれに応じてワークフローを自動的に管理します。これにより、ワークフローと定型コードが明確に分離され、従来のアプローチよりもコードの可読性が大幅に向上します。タスクツリーが面倒な処理を代行してくれるため、複雑なワークフローであっても、一箇所で明確かつ正確に記述することができます。

さらに、Qt TaskTreeはAPIの非互換性の問題を解決し、さまざまな非同期APIを共通のインターフェースに統合することで、あらゆる非同期タスクをこのモジュールで動作するように適応させることができます。
Qt TaskTreeは、非同期コードの記述や読み取りに対する考え方を変える大きな変更点です。詳細については
その他の主な改善点
Qt 6.11 リリースにおけるその他の大きな改善点としては、UI フレームワークの機能追加、Web サービスへの接続の簡素化やその他の接続性に関する改善、そして QML と C++ の統合の容易化などが挙げられます。
UIフレームワークと2D機能の追加
LottieおよびSVGベクターアニメーションのサポート強化に向けた取り組みに対し、多くの素晴らしいフィードバックをいただきました。Qt 6.11では、その取り組みをさらに進めています。現在では、パスアニメーションやモーフィングアニメーションに加え、マットレイヤー、SVGマスク、SVGシンボルもサポートしています。また、CSSアニメーションのタイミング関数の事前定義されたサブセットに対応しており、Qt Quick VectorImageモジュール用のLottieバックエンドおよびlottietoqmlツールは、安定版となり、テクニカルプレビューの段階を脱しました。
UIフレームワークに関しては、Qt Quick Controlsに要望の多かったDoubleSpinBoxを追加し、DialogButtonBoxにおけるデフォルトボタンの動作を制御するAPIを追加しました。また、RectangularShadowエフェクトの角の半径を個別に制御できるようにしました。
Qt Widgets ユーザー向けに、QWizard に新しい StretchBanner オプションを追加する機能、新しい keyboardSearchFlags を使用して QAbstractItemView のデフォルトのキーボード検索の動作を調整する機能、および QColumnView 内のプレビュー列 の表示/非表示を制御する機能を統合しました。
Qt Quick Controls と Qt Widgets の両方で、アクセシビリティクライアントが UI 要素をナビゲートし、ロールや方向の変更について通知を受け取る方法を改善しました。
Webおよび接続機能の改善
Qt 6.11では、Webサービスとの統合に引き続き注力しました。Qt OpenAPIモジュールを使用することで、Qt NetworksのRESTful APIを利用するQt HTTPクライアントコードを簡単に生成できるようになります。このジェネレータはOpenAPI Generatorのプラグインであるため、OpenAPI YAML仕様を取り込み、高度なカスタマイズが可能で、cmakeビルドシステムと統合されています。
詳細については
Qt GRPC では、リクエストとレスポンスの流れや内容を制御するための新しい仕組みを追加しました。Qt HTTP Server モジュールにより、スケーラブルなサーバーの実装が容易になり、制限を制御するためのいくつかの改善に加え、ワーカースレッドでレスポンスを処理できるようになりました。最下位レベルでは、QNetworkRequest で現在のリクエストの TCP Keep Alive パラメータを指定できるようになり、デフォルトでは、2 分間操作がない接続は自動的に切断されるようになりました。
QMLとC++の統合がさらに容易に
QML言語サーバーは、QML型のC++定義がどこにあるかを認識するようになりました。これにより、IDEから両言語間を簡単に移動できるようになりました。C++コードではIDによってQMLオブジェクトを検索でき、QMLコンテキストの階層構造を容易に探索できるようになりました。C++で宣言されたプロパティには、誤ってプロパティが隠蔽されるのを防ぐため、明示的にvirtualやoverrideのタグを付けることができます。
Qt 6.10での導入に続き、QRangeModelにはコンパニオンクラスであるQRangeModelAdapterが追加されました。これは、QAbstractItemModelプロトコルに準拠しつつ、モデルデータを変更するためのC++ APIを提供します。各行または各アイテムが同じ QObject サブクラスによって裏付けられているデータの場合、QRangeModel は各オブジェクトのプロパティ変更通知を dataChanged() シグナルに 自動的に接続し、追加のコードを記述することなく、データ変更に関する UI の最新状態を維持できます。これにより、QAbstractItemModel API を扱う必要がなく、C++ バックエンドコードからのデータを Qt Quick(または Widget)アイテムビューで利用できるようになります。
詳細については
その他の新機能
上記では、Qt 6.11における主な新機能の一部をご紹介しました。「Qt 6.11の新機能」ドキュメントには、リアルタイム音声処理のための新しいQt Multimedia APIなど、他にも多くの情報が掲載されています。Androidプラットフォームを対象とする開発者の皆様は、Qt JennyやQtQuickViewの改良、およびQJniObjectのデフォルトの例外処理を無効にできる機能のおかげで、C++からJava/Kotlin APIを呼び出すことや、その逆の操作がより容易になりました。
独自のAPIのドキュメント作成にqdocをご利用の場合、特にモダンC++のコンセプトを使用する際に利用できる新しいコマンドが多数追加されています。モダンC++ APIのHTMLへのレンダリングが改善されたことで、Qt内のテンプレートを多用するAPIの読みやすさが向上しました。
謝辞
Qt 6.11の実現にご協力いただいたすべての貢献者の皆様に感謝申し上げます。Qtのソースコードにパッチを提供してくださったコミュニティメンバーの完全なリストは、リリースノートの末尾に掲載されています。
特に、バグの報告やユースケースの共有、フィードバックの提供を通じて、Qtの改善にご協力いただいた皆様に深く感謝申し上げます。ベータ期間中のテクノロジープレビューモジュールや新機能に関するご意見は、大変参考になりました。最後に、今回のリリースの実現にご尽力いただいたすべての方々に、心より感謝申し上げます!
今すぐアップデート!
いつものように、新しいリリースはQtインストーラーから入手できます。また、当社のウェブサイトまたはQtアカウントページから、このリリースをダウンロードすることも可能です。