Qt 5 アルファ版

この記事は Qt Blog の "Qt 5 Alpha" を翻訳したものです。
執筆: Lars Knoll, 2012年4月3日

本日 Qt 5 のアルファ版をリリースしました。Qt Project への開発体制の移行後、初のメジャーリリースになります。これまで数多くの関係者がこのリリースのために尽力してきました。Nokia の社員ではない方々もこのアルファ版に向けた多くの作業や新機能の実装を行ってきました。このプロジェクトに様々な人が加わり、一丸となって Qt をさらに良いものにしていることを大変嬉しく思います。

Qt 5 のアルファ版のリリースの主な目的は、今後のリリースをより良いものにするためのフィードバックを得ることです。このアルファ版では Qt 5 が提供する機能のうち、基本的な機能で構成される Qt Essential のモジュールにフォーカスしています。

アルファ版は http://qt-project.org/wiki/Qt-5-Alpha からダウンロードできます。今回はソースコードのみのリリースで、バイナリの提供はありません。みなさんの手でビルドをしていただく必要があります。ビルドの手順については http://qt-project.org/wiki/Qt-5-Alpha-building-instructions を参照してください。

昨年の5月に「Qt 5 に関する構想」という記事を書いて以来、Qt 5 の開発に9ヶ月の月日を費やしてきました。その記事の中にも Qt 5 の構想がいくつも書かれていますが、ここまで成し遂げたことについて再度述べたいと思います。

ビジョン

Qt 5 の開発を進める上で、1つの基本的なビジョンがありました。

"Qt 5 はアプリケーション開発の新方法となる。強力な Qt のネイティブの C++ の機能をすべて提供しつつも、C++ の役割を Qt Quick のバックエンドの機能を実装するためのモデル側にシフトさせる。"

Qt 5.0 はこのビジョンに非常に沿ったものになると胸を張って言うことができます。Qt 5.0 はフルスクリーンの UI を持つ組み込み系の上で非常によく動いています。デスクトップについては、ほとんどの基本的な機能はすでに揃っていますが、本当の意味で機能するのは 5.1 か 5.2 になるでしょう。

オープンな開発体制

Qt 5 の開発はコミュニティとともにオープンに行いたいと思っていました。qt-project.org の発足以降、活発なコミュニティがこの中に形成され、数多くのパッチの提供や新機能の提案、実装が Qt 5 に対して行われました。

4つの大きなアーキテクチャの変更

Qt の内部のアーキテクチャに対して4つの大きな変更を行うことを目指していました。

  1. Qt のすべてのプラットフォームは Qt Platform Abstraction(QPA) で対応 – 様々なウィンドウシステムへの移植をより簡単に
    Qt を各 OS 上のウィンドウシステムへ移植するための新しいレイヤーを QPA として実装しました。QPA は QWS/Qt Embedded の代替として Qt 4.8 で導入された機能ですが、Qt 5 ではすべてのプラットフォームがこの仕組みを利用するようになります。これにはプラットフォームに依存するコードの大部分の書き換えが必要でしたが、プラットフォーム依存の部分がきれいに抽象化されたとても明快なアーキテクチャになりました。この QPA への移行により、他のウィンドウシステムへの移植が本当に簡単になりました。QPA を利用し書かれた QNX や Android、iOS のバックエンドはこれを証明するものです。
  2. グラフィックスタックアーキテクチャの刷新 – Qt Quick と OpenGL (ES) 2.0 でパフォーマンスが向上
    Qt 5 では OpenGL 上でシーングラフを使用した Qt Quick のための新しいグラフィックのアーキテクチャが導入されました。これにより OpenGL (ES) 2.0 以上が必須になりました。QtGui には以前の QGL* クラス(互換性の保持のため利用は可能)に代わる QOpenGL* というクラスが追加されました。また、QApplication よりも軽量な QGuiApplication と、画面上のトップレベルウィンドウを操作するための QWindow という新しいクラスが導入されました。QPainter をベースとした QWidget 系のグラフィックスタックも Qt 4.x と同じように動作し続けます。しかし、QPainter についてはサポートするバックエンドを以前よりも少なくしました。現在利用可能なものは、画面に描画するためのソフトウェア描画のバックエンド(ラスター)と、OpenGL 用のバックエンド、PDF 生成用、印刷用の4つになります。X11 や CoreGraphics などを利用したプラットフォーム依存のバックエンドは無くなりました。これらの変更は Qt 4.x の QWidget と完全に互換性を保ったまま、長期的な新しいグラフィックのアーキテクチャを導入するのにとても役に立ちました。
  3. 柔軟性の向上とデスクトップとモバイルの融合に対応するためのリポジトリ構成のモジュール化 – Qt Mobility API の統合、必要に応じたモジュールの追加/削除
    これはどちらかというと内部構造の変更で、Qt を利用している開発者の方が直接目にすることはないでしょう。しかし、Qt のリポジトリのモジュール化により、 Qt の様々な機能の開発を独立して進められるようになります。Qt 5 の安定の向上や、5.0 のリリース後にバイナリ互換性を保つため、このモジュール化はさらに重要な意味を持つでしょう。モジュール化については完全には完了していません。特に qtbase リポジトリには別モジュールとして分離すべき機能がまだ含まれています。このため、このモジュール化の作業は 5.0 以降も続くでしょう。Qt のモジュール化によりサードパーティーのモジュールの Qt への貢献もとても簡単になります。モバイルではロケーション機能やセンサーなどが使用されますが、このようなデスクトップとタブレット/モバイルで必須機能が異なるという最近の傾向にも対応が可能です。Qt 5 では Qt Mobility API は Qt の一部として統合されます。いくつかの機能は "Qt Essentials" と呼ばれる Qt の中でも必須機能を集めたグループに含まれます。このモジュール化のアプローチにより、簡単に他のモジュールを追加することも可能になりました。Qt 5 は Qt 史上最も多くの機能を提供するものになるでしょう。このアルファ版では Qt Essentials にフォーカスをしていることに注意をしてください。
  4. QWidget 関連のすべての機能を専用のライブラリに分離
    ウィジェットの専用のリポジトリへの分離により、ウィジェットの存続させつつ、すべての UI が QML と Qt Quick によって書かれるようなモデルへの道筋を確かなものにしました。これは長期的な視点で Qt 5 のアーキテクチャをクリーンにするという一つの良い指標になります。

これらの変更を表明した際には様々な反応がありましたが、Qt 5 に関する一般的なものやアーキテクチャの変更についての疑問に対する回答の多くは「Qt 5 に関する回答」で見ることができます。

新機能

アーキテクチャの変更以外にも、Qt 5 は様々な新機能を提供します。ここではいくつかに絞って紹介しますが、詳細を wiki で見ることができます。

  • Qt Core
    QtCore にはとても多くの新機能が追加されています。メディアやドキュメントなどの標準の場所を取得するための QStandardPaths クラスが追加されました。JSON パーサーと高速性に最適化された JSON のバイナリフォーマットも追加されています。拡張子やファイルの内容による Mimetype の判定にも対応しました。コンパイル時にチェック可能なシグナル/スロット接続の記述形式もサポートされ、Perl 互換の正規表現エンジンも新たに追加されました。データ構造の多くが書き直され、パフォーマンスの向上のための最適化が行われました。C++11 への対応も各所で行われていますが、Qt は C++98 規格のコンパイラでも動作します。
  • Qt Gui
    QWidget 関連のすべてのクラスが新たな QtWidgets ライブラリへと移動しました。QtGui の役割は QWindow クラスによるトップレベルウィンドウのサポートにシフトしました。また、OpenGL のサポートが組み込まれています。
  • Qt Network
    DNS のルックアップがサポートされ、QHttp と QFtp クラスが削除されました(必要な方には別の形で提供する予定です)。その他にも様々な改善が行われました。
  • Qt Widgets
    QPA のアーキテクチャへの対応が行われ、Qt 4.x の時と同じように動作するはずです。
  • Qt Quick
    Qt 4.x の時代の Qt Quick は Qt Quick 1 というモジュールで利用可能で、互換性は保たれています。今後は Qt Quick 1 モジュールの開発は行われないでしょう。Qt Quick モジュールでのフォーカスは、新しい Qt Quick と Qt Qml モジュールになります。Qt 5 では Qt Quick のグラフィック関連の機能と、QML や JS といった言語関連の機能を別々のモジュールに分割しました。新しい JS のクラス(QJSEngine や QJSValue)は、裏では Google の V8 エンジンを使用するようになり、JavaScript のパフォーマンスが大幅に向上しました。QML のエンジンにも様々なパフォーマンスの改善や言語の拡張がなされました。Qt Quick モジュールには OpenGL をベースとしたシーングラフと Qt 4.x の Qt Quick からよく知られている基本的なアイテムが含まれます。GLSL を利用したシェーダーエフェクトやパーティクルなどが新たにサポートされました。 QML の部分についてはほぼソースコードの互換性がありますが、C++ で QML のアイテムを書く場合にはシーングラフへの対応が必要となります。
  • Qt 3D と Qt LocationQt Essentials に新しいモジュールが追加されています。Qt で 3D のコンテンツを扱うための Qt 3D と、GPS や地図や他の位置ベースのサービスにアクセスするための Qt Location です。
  • Qt WebKit
    WebKit の C++ の API は Qt 4.x から変更はありませんが、Qt WebKit は様々な改善や HTML 5 の対応が向上した webkit.org の新しいバージョンにアップデートされました。Qt WebKit のビルドは現在は少し複雑なため、Windows では無効になっています。この対応は現在進められていて、ベータ版では問題なく動作するようになるでしょう。

Qt 4.x から Qt 5 への移植

Qt 4.x と Qt 5 の間にはバイナリの互換性がなく、ソースの互換性がない部分がわずかにありますが、既存のコードの Qt 5 への移植をなるべく簡単にスムーズに行えるように努めてきました。一例ですが、Qt Creator は同じソースを利用して Qt 4.x と Qt 5 の両方でビルドができ、動作するようになっています。

みなさんのプロジェクトを Qt 5 で試してみたい場合は、こちら の移植の手順を参照してください。

Qt 4.8 自体は Digia のような企業やコミュニティによってしばらくはサポートされるため、今すぐ Qt 5 に対応する必要はありません。しかし、Qt 5 には、これに対応するだけの価値が十分にあることは間違いないと思っています。

次のステップ

Qt 5.0 に向けて様々なことが行われてきているのが分かっていただけたと思います。ここまでの成果には非常に満足しています。Qt 5 の正式リリースをより良いものにするために、是非このアルファ版をダウンロードして、試してみて、フィードバックをしていただけたらと思います。

フィードバックの方法は、Qt の開発者用のメーリングリスト(development@qt-project.org 詳細は lists.qt-project.org を参照)への投稿もしくは バグトラッキングシステム でのバグレポートになります。codereview.qt-project.org へのパッチによる貢献も、もちろん大歓迎です。

このアルファ版は Qt 5 の正式リリースに向けた第一歩で、今後は Qt 5.0 を一日も早くみなさんにお届けするための様々な問題の解決に集中していきます。

ここまでたどり着くまでに、本当に様々な方が参加してくれました。個々の名前は書ききれませんが、今回のリリースに対して様々な形での貢献をしてくれたすべての方に感謝を申し上げたいと思います。

Enjoy!

Lars


Blog Topics:

Comments