Qt6.0をリリースしました
12月 09, 2020 by Qt Group 日本オフィス | Comments
この度は、Qt 6.0のリリースを発表できることを大変うれしく思います。これは新しいメジャーバージョンの最初のリリースであり、Qtの重要なマイルストーンになります。Qt 6.0は、数年前に最初のアイデアが浮かび、それを具現化するために行った膨大な量の作業の結晶です。
本記事はLars Knollによる「Qt 6.0 Released」の抄訳です。Qt 5は何年にもわたって素晴らしい成功を収め、Qt 5.0をリリースして以来、過去8年間でユーザーベースとQtの使用量が大幅に増加しています。しかし、私たちの周りの世界も2012年以来大きな変化を遂げています。Qtに直接影響するものには、C ++の進化、3Dグラフィックス用のさまざまなAPIの導入、組み込みシステムでのQtの活用の促進などがあります。
クロスプラットフォームフレームワークとして、Qtはこれらの変化する要件に対応して調整する必要があります。Qt 5のライフタイム中、これらの要件の多くに非常にうまく適応することができました。ただし、Qt 5シリーズ内で完全なソースとバイナリの互換性を維持するために、その存続期間内に修正できない事項がいくつかありました。Qt 6では、これらに対応し、今後数年間により適したQtを構築することができました。
したがって、Qt 6の使命は、Qtが将来のProductivity Platform(生産力あるプラットフォーム)に育てることです。QtのメジャーリリースであるQt 6.0は、新しい機能を実装するためのより高い自由度を提供し、現在および将来の要件をより適切にサポートします。Qt6.0はQt 5シリーズから高い継続性を維持しているので、ユーザーが移行する際に混乱を招くことはありません。これらのアイデアの一部は、約18か月前に投稿したQt6のビジョンに関するブログ投稿に記録されています。
Qt 6を開発するにあたり、私たちは特に、Qtがお客様とユーザーに対して持つコアバリューを確実に守りたいと考えました。
- 1つのテクノロジーで、単一のコードベースから、あらゆるデスクトップ、モバイル、および組み込みプラットフォームにアプリケーションをデプロイすることを可能にする高いプラットフォーム性
- ローエンドである単一目的デバイスから、ハイエンドで複雑なデスクトップアプリケーションや、コネクテッドシステムまでのスケーラビリティ
- ワールドクラスのAPIとツール、およびドキュメントにより、アプリケーションとデバイスの作成の簡素化
- 最小限の労力で大規模なコードベースを維持させる高い保守性、安定性、互換性
- 150万人以上のユーザーがいる大規模な開発者エコシステム
Qt 6.0は、新しい市場の需要に対応するQt 6シリーズの最初のリリースであり、これらのコアバリューを私たちの活動の中心に据えています。
Qt 6を開発するとき、Qtの最も中心的な部分のいくつかについて、これらを改善する方法を非常に入念に調査しました。改善にかなりの時間を費やした、主な重点分野は次のとおりです。
- C ++ 17の活用
- 次世代QML
- 新しいグラフィックアーキテクチャ
- QtQuick用の統合された2Dおよび3D
- CMakeビルドシステム(qmakeは引き続きアプリケーション向けにサポート)
もちろん、他の場所でも多くの改善に時間を費やしてきましたが、ここでそれらすべてに言及することは難しいので、詳細はwikiページをご覧いただければと思います。また、Meet Qt 6ウェビナーを米国向け、欧州/アジア向けに開催する予定ですので合わせてご利用ください。ここでは、最も重要な項目のいくつかを見てみましょう。
C++17
Qt 6では、C ++ 17互換のコンパイラが必要になりました。これにより、Qtの開発時に最新のC ++言語構造を使用できるようになり、API側の統合ポイントも可能になります。
コアライブラリとAPI
Qt Coreは、Qtの最も中心的な部分を実装するモジュールであるため、多くの作業が行われています。私たちはそこで多くの分野を吟味し、改善を行いました。最も中心的なもののいくつかをあげると:
- 新しいプロパティとバインディングシステム:QMLを大きな成功に導いたバインディングの概念をC ++からも利用できるようにします。
- 文字列とUnicode:Qt 5で、QtとUnicodeの完全な整合に向けて始動しました。すでに多くの作業が行われていますが、いくつかの項目が残っていたため、Qt 6でクリーンアップしました。詳細については、後日、別のブログ投稿で説明します。
- QListは、Qt 5において、しばしば批判されるクラスでした。これは、格納されているオブジェクトがポインタよりも大きいため、ヒープ割り当て方法に大きな負荷がかかるためです。Qt 6では、これを変更し、QListとQVectorを1つのクラスに統合しました。詳細については、Qt 6のQListに関するブログを参照してください。
- QMetaTypeとQVariantは、Qtのメタオブジェクトシステムがどのように機能するかの基礎を成します。シグナルとスロットはQMetaTypeなしでは不可能であり、動的呼び出しにはQVariantが必要です。これらの2つのクラスはQt 6でほぼ完全に書き直されました。詳細については、こちらをご覧ください。
グラフィックに関係のないQtの他の部分にも大きな変化があります。たとえば、Qt Concurrentは、ほぼ完全に書き直され、マルチスレッドアプリケーションの開発がこれまでになく簡単になりました。Qt Networkでは、多くのクリーンアップと改善が行われています。詳細については、このブログを参照してください。
新しいグラフィックアーキテクチャ
Qt 5のグラフィックアーキテクチャは、基盤となる3DグラフィックAPIとしてOpenGLに大きく依存していました。これは、2012年の第5四半期時点においては正しいアプローチでしたが、MetalとVulkanの参入により、過去2年間で市場が大きく変化しました。現在、さまざまなプラットフォームで一般的に使用されているさまざまなグラフィックAPIの大規模なセットがあります。クロスプラットフォームフレームワークとしてのQtにとっては、これらに適応し、ユーザーが最大のパフォーマンスであらゆる3DグラフィックAPIに対してQtを実行できるようにしなければなりませんでした。
そのため、Qt 5はハードウェアアクセラレーショングラフィックスをOpenGLに依存していましたが、Qt 6では状況が完全に変わります。Qt Quickのすべての3Dグラフィックは、RHI(Rendering Hardware Interface)と呼ばれる3Dグラフィックの新しい抽象化レイヤーの上に構築されています。これにより、Qtは基盤となるOS /プラットフォームのネイティブ3DグラフィックスAPIを使用できるようになります。そのため、Qt QuickはWindowsではDirect3Dを使用し、macOSではMetalをデフォルトで使用するようになりました。詳細については、RHIに関するブログ投稿シリーズをご覧ください。
QtのOpenGL固有のクラスはまだ存在しますが、QtOpenGLモジュールのQtGuiの外に移動しました。また、クロスプラットフォームの方法でこれらのAPIのさまざまなシェーディング言語を処理できるように、QtShaderToolsと呼ばれる新しいモジュールを追加しました。
Qt Quick 3D と Qt 3D
Qt Quick 3Dは比較的新しいモジュールです。 Qt Quickを3D機能でシームレスに拡張します。Qt Quick 3Dでは、複雑な3Dシーンの作成を完全にサポートしながら、Qt Quickの既存の部分(2Dユーザーインターフェイス用)と同じくらい使いやすいAPIを作成することに重点を置いていました。もちろん、これの重要な部分は、2Dコンテンツと3Dコンテンツをシームレスに統合することです。
このモジュールにおいては、Qt 6で、Qt 5シリーズでは実現できなかった大幅な改善を実施しました。最も重要なことは、基盤となるグラフィックAPIとハードウェアを最適に利用するために常にRHI抽象化レイヤーを使用していることです。さらに、2Dと3Dコンテンツをより深く、よりパフォーマンスの高い方法で統合できるようになり、2Dアイテムを3Dシーンに配置できるようになりました。また、glTF2と物理ベースのレンダリングのサポートが大幅に改善され、他のツールで作成されたアセットを簡単にインポートできるようになりました。モジュールには他にも多くの主要な改善点があります。より詳細な説明はこのブログに記載しています。
Qt 3DもRHI抽象化レイヤーの最上位に基づいており、パフォーマンスの向上とクリーンアップをいくつか施しています。詳細については、パートナーKDAB社の2つのブログ投稿(こちらとこちら)をご覧ください。
Qt Quickのデスクトップスタイリング
Qt Quick用に用意されている一連のコントロールは、軽量でパフォーマンスが高いことに重点を置いて作成されています。そのため、Qt5ではデスクトップスタイリングをサポートしていませんでした。ただし、Qt 6では、デスクトップオペレーティングシステムでネイティブのルックアンドフィールを実現する方法を見つけることができました。Qt 6.0では、Qt QuickがmacOSとWindowsの両方でネイティブスタイルをサポートするようになりました。詳細については、このブログを参照してください。AndroidとLinuxのネイティブルックアンドフィールは、Qt5のMaterialスタイルとFusionスタイルで以前から存在していました。将来のQtリリースに向けてそれらの改善に取り組んでおり、iOSのネイティブスタイルの実装も計画しています。
プラットフォーム固有の機能を持つ
インターフェース
Qtはプラットフォームに依存しない方法でアプリケーションを開発するために必要なほとんどの機能を提供しているとはいえ、プラットフォーム固有の機能とのインターフェースが必要になる場合があります。Qt 5では、そのような場合に役立つ一連のアドオンモジュール(QtX11Extras、QtWinExtras、QtMacExtras)を提供しました。しかし、Qtの他の部分からこれを完全に分離することは、Qt内でいくつかのアーキテクチャ上の問題、不整合、およびコードの重複を引き起こしました。Qt 6では、これをクリーンアップし、これらのアドオンモジュールによって提供される機能を、Qtで直接提供されるプラットフォーム固有のAPIに折りこむよう取り組みました。これにより、Qt 6でOS /プラットフォーム固有のAPIとの連携がはるかに簡単になります。詳細については、こちらをご覧ください。
ビルドシステムとパッケージング
また、Qtのビルドと配布の方法にいくつかの大きな変更を加えました。ここで最初に言及することは、Qt 6自体がCMakeを使用して構築されていることです。これにより、CMakeを使用して独自のプロジェクトを構築するすべてのユーザーに大幅な改善がもたらされました。もちろん、qmakeはQt 6のライフタイム中も引き続きサポートされるため、qmakeを使用している場合でもビルドシステムに変更を加える必要はありません。ただし、今後のすべての新しいプロジェクトにはCMakeを使用することをお勧めします。
また、Qt 6は、より小さなデフォルトパッケージとして配布され、アドオンの多くは、パッケージマネージャーを介して個別のパッケージとして配布されるようになりました。これにより、アドオンのリリーススケジュールを市場の要件に柔軟に適合させることができます。たとえば、コアQtパッケージとしてより頻繁な機能リリースを可能にしたり、複数のQtバージョンで同時に利用できるようにしたりできます。さらに、パッケージマネージャーをサードパーティコンテンツの配信チャネルとして使用できます。そして最後に、ユーザーは本当に必要なものだけをダウンロードすることを選択できるため、ユーザーサイドにおける柔軟性が高まります。
現在、パッケージマネージャーのバックエンドとして既存のQtインストーラーを使用していますが、将来のリリースについては代替案を調査しています。詳細については、こちらのブログ投稿をご覧ください。
互換性
Qt 6の変更を行う際、既存ユーザーサイドで発生してしまう中断を最小限に抑えながら、将来的に必要と思われるものにAPIを調整するよう試みました。Qt 6を最大限に活用するには、コードを調整する必要がありますが、新しいバージョンへの移植をできるだけ簡単にするように努めました。
最初に行ったことの1つは、コードベースをクリーンアップすることでした。Qt 5の存続期間中、かなりの数のAPI、さらにはモジュールが非推奨になりました。将来のために私たちが最初にしたことは、よりスリムなQtを実現するために、これらを削除し、今日では意味をなさないものをいくつか捨てることでした。
ただし、Qt 5.15で廃止されたAPIを可能な限り非推奨にするように注意を払っています。非推奨の警告を有効にし、それらをクリーンアップすることで、コードベースをQt 6で機能させるための長い道のりを助けてくれるはずです。
Qt 5で削除されたAPIのいくつかは、Qt5CoreCompatモジュールに移動しました。これには、Qt 6から削除されたQRegExp、QTextCodec、XML用の古いSAXパーサーなど、広く使用されているクラスがいくつか含まれています。このモジュールはQt 6移植の手助けとして意図されており、Qt 5に対するリグレッションとセキュリティ関連の問題を除いて、バグ修正は受け付けません。これは移植用に使用しながらも、モジュールへの依存関係を段階的に削除することをおすすめします。
Qt 6への移植を開始したい方向けに、ドキュメントにさらに詳細な移植ガイドを用意しています。
対応プラットフォーム
Qtは常にクロスプラットフォームのフレームワークであり、もちろんQt6でもこれを継続します。Qt 6.0は下記をサポートしています
- Windows 10
- macOS 10.14以降
- Linux (Ubuntu 20.04, CentOS 8.1, OpenSuSE 15.1)
- iOS 13以降
- Android (API level 23以降)
組み込み側では、Linuxを実行するさまざまな組み込みデバイスをサポートしています。Qt 6は、Qt 5でサポートされている組み込みリアルタイムオペレーティングシステムについてはまだサポートしていません。QNXとINTEGRITYの両方が最近C ++ 17のサポートを追加したため、Qt6.2がリリースされるまでにサポートする予定です。
見通し
Qt 6.0は、Qt 5.15にある多くのアドオンモジュールをまだサポートしていません。この決定は、Qtフレームワークの重要なモジュール内で行う必要のあるすべての変更を確実に実行できるように、十分な時間を確保するために意図的に行ったものです。
現在、これらアドオンのほとんどについてQt 6に移行する作業を行っています。ここではすでに多くの作業が行われており、Qt 6.2がリリースされるまでにほとんどのアドオンが再びサポートされる予定です。多くのアドオンはすでにQt 6に対してコンパイルされていますが、クリーンアップ作業とリファクタリングがまだ行われていないため、まだ正式にリリースされていません。Qt 6.2をリリースするまでに、重要なアドオンのほとんどを移植できると考えています。アドオンサポートに関する見通しの概要はこちらのブログ投稿よりご確認ください。
不足しているアドオンをQt 6に移植することは別として、今後数か月間のQt 6関連の作業の多くは、新しいリリースの安定性と、Qt自体の中で新しいプロパティシステムをより広く使用することに焦点を当てる予定です。
Qt 6.1とQt 6.2のリリースタイムラインを少し調整し、4月にはQt 6.1をリリースする予定です。その後、9月末までにQt 6シリーズの最初の長期サポートバージョンとなるQt 6.2LTSのリリースを計画しています。
そして、2020年はまだ終わっていません。クリスマス前に、Qt CreatorとQt Design Studioの新しいバージョンのリリースも予定されています!もちろん、どちらもQt 6を完全にサポートします。
まとめ
Qt 6.0は、次世代のQtの出発点です。まだQt 5.15ほど完全な機能ではありませんが、これらのギャップは今後数か月以内に埋められます。Qtの次のバージョンの基礎を形づくる上で重要な多くの作業を行いました。これらの変更の結果の多くはすぐには現れないかもしれませんが、今後数年間でQtの競争力を維持するのに役立つと強く信じています。
また、末筆ではありますが、Qt 6.0の実現にご協力いただいた皆様に感謝いたします。 Qt 6には、ここに書ききれないほど多くの人々が貢献してくれました。多くのお力添えをありがとうございました!
最後に、Qt 6を皆さんが気に入ってくれることを願っています。お気に入りのモジュールがまだ移植されていなくても、現在取り組んでいますので心配しないでください。新しいバージョンQt 6は、弊社のWebサイトまたはQt Account.からダウンロードしていただくことが可能です。是非、ご意見もお聞かせください。フォローアップリリースをさらに改善するために、すべてのフィードバックに感謝いたします。
Blog Topics:
Comments
Subscribe to our newsletter
Subscribe Newsletter
Try Qt 6.9 Now!
Download the latest release here: www.qt.io/download.
Qt 6.9 is now available, with new features and improvements for application developers and device creators.
We're Hiring
Check out all our open positions here and follow us on Instagram to see what it's like to be #QtPeople.