QML エンジンの内部構造(バインディングの詳細)

先月作成した「Qt Quick 2 のスピード」という記事ですが、こちらの予想以上に読んでいただいているようです。その記事では紹介していませんでしたが、QML エンジンの内部構造については KDAB が “QML Engine Internals” というシリーズの記事を作成しています。興味の有る人は是非そちらも読んでみてください。

今回はその中の “QML Engine Internals, Part 3: Binding Types” を基に 「Qt Quick 2 のスピード」の補足をしてみようと思います。

“QML エンジンの内部構造(バインディングの詳細)” の続きを読む

Windows Runtime 向け Qt5 のポーティングがスタート

Windows Runtime(WinRT) とは Windows 8 のモダン UI のベースとなるプラットフォームです。今までは WinRT への Qt のポーティングは調査中と言うことでしたが、その開始が Digia の Qt blog で宣言されました。

まずは QPainter(QtWidgets) を動かすところからはじめて、ANGLE のポーティングによる OpenGL および QtQuick への対応、また、Qt Creator のプラグインなどを計画しているそうです。コメントによると QtWidgets は既に動いているようです。

詳しいことは Wiki の記述をチェックしてみてください。

こうなると気になってくるのが Windows Phone 8(Windows Phone Runtime)への対応でしょうか。Window Runtime と Windows Phone Runtime の API は共通の部分もあるものの、全く同じものではありませんので、これをそのまま用いることは出来ないかもしれませんが、これをベースに Windows Phone 8 で Qt5 を動かそう としている人もいるようです。

なお、ポーティングが始まったとはいえまだまだリサーチプロジェクトの段階で、今年の後半に予定されている Qt 5.2 である程度の形になることを目標にしているそうです。

Qt 5.0.1 リリース

Qt 5.0.1 がリリース されました。基本的には 5.0.0 のバグ修正版になりますが、それ以外にも以下の違いがあります。

  1. QtMultimedia モジュールに対するバイナリ互換性の変更
  2. MinGW 版バイナリパッケージの追加

Qt では本来は同じメジャーバージョン内ではバイナリ互換性を維持することになっていますが、QtMultimedia モジュールで見つかったミス(インターフェースとなる基底クラスのデストラクタが virtual ではない)のため、メモリリークが発生することから今回は例外としてバイナリ互換性を破壊する修正を取り込んでいます。QAudioSystemFactoryInterface や QMediaServiceProviderFactoryInterface を継承したコードを 5.0.0 で書いていた人は 5.0.1 で再コンパイルしてください。

また、MinGW 用バイナリが用意されました。最新の MinGW が必要となったことから、4.7 プレリリース版を同梱しているため 800MB を超える巨大なパッケージとなってしまいましたが……。

今回から変更履歴が各モジュールごとに分割されています。なお、5.0.0 のパッケージにあったメンテナンスツールでのアップデートは出来ませんので、アップデートには 5.0.0 のアンインストールと 5.0.1 のインストールが必要になります。

QtWebKit 2.3β1

Qt の WebKit モジュール(QtWebKit)には Qt 自身のバージョンとは個別のバージョン番号があることをご存じですか。例えば、Qt 4.8 に同梱されている QtWebKit は 2.2 ですし、Qt 5.0 では QtWebKit 3.0 になります。

Qt Project では Qt の新機能の開発は Qt5 に対して行われていて、Qt4 はメンテナンスモードになっています。QtWebKit も Qt4 向けの 2.x 系は公式にはメンテナンスモードなのですが、非公式のプロジェクトとして Qt5 の QtWebKit 3.0 同等の機能を Qt4 で実現する QtWebKit 2.3 が開発されています。

その QtWebKit 2.3 が β1 となりました。QtWebKit 2.3 では QtWebKit 3.0 同様に多くのバグフィックスと WebGL, CSS Animation, CSS Shader 等の新機能の追加が行われています。

詳しくは以下の記事を参照してください。

Qt Quick 2 のスピード

Qt5 の目玉である Qt Quick 2 は OpenGL や QML Scene Graph、V8 JavaScript エンジンの採用でパフォーマンスを Qt Quick 1 から大幅に向上させています。とは言うものの、バグや Mesa のようなソフトウェア 3D エンジンの利用などで Qt Quick 1 よりも遅くなることもあります。

は Qt Quick 2 でアプリが遅くなったことに関する質問から始まったやりとりですが、その中で Qt5 では上記以外にどのようなテクニックを使って Qt Quick のパフォーマンスの改善を行っているかの説明があります。興味深い内容ですので、要約してみましょう。

“Qt Quick 2 のスピード” の続きを読む

Qt5 の Input Method

先日の勉強会 では話題にするのをすっかり忘れていましたが、Qt5 では Input Method も大きく変更されています。思ったよりも調査に時間がかかったため遅くなってしまいましたが、簡単な説明資料を作成しておきました。不明点など有りましたら質問してください。

基本的には以下の目的を満たすように設計し直されています。

  • QtGui と QtWidgets の分離に合わせて、QWidget 依存の削除
  • アプリとの連携機能の強化

とはいえ、組み込み等で Input Method を作成していた人や細かな制御を行っていたような一部の人を除けば、(特にデスクトップ系では) API の変更が直接影響するケースは少ないと思います。(間接的には QPA への移行などによるコード変更によって、挙動に問題が生じていないかは気をつけた方がいいかもしれません。)

“Qt5 の Input Method” の続きを読む

Qt を Web ブラウザで動かす

Google の Native Client 上で Qt を動かす試みは比較的前から有る話題でしたのでご存じの方もいらっしゃると思いますが、最近、それとは別のアプローチで Qt を Web ブラウザで動かしている例がありました。

詳しいことは以下の記事とそこからリンクされているそれ以前の記事を参照してください。

それは Emscripten というプロジェクトを用いて実現されています。Emscripten は LLVM をベースにして、C/C++(や LLVM のフロントエンドがサポートする言語) を JavaScript へコンパイル(コンバート?)することが出来ます。上記の記事では Emscripten を使って、Qt を JavaScript にコンパイルしてブラウザ上で動かしています。画像を見ると Firefox や Chromium で動いているところが確認できます。実際に動かしてみたい方は記事中にデモへのリンクがあるのでそちらをたどってみてください。QtCore と QtGui とアプリをまとめて JavaScript にするため、ファイルサイズは数MB以上と大きくなり、実際に動き出すまでの時間はかかりますが、ランタイムやプラグインのインストール無しに Qt アプリが動いている様子はなかなか面白いものです。さすがに、レスポンスが良いとは言えませんが。

動かしている Qt のバージョンについての詳しい記述はありませんが、QWS で動かしていることから Qt4 系だということは分かります。やり方によっては QtWebKit や QtScript 上で Qt を動かすような事も出来るかもしれません。

Qt 5 のサポートアーキテクチャの今後

Qt5 の QAtomicIntQAtomicPointer では Qt4 とのソース互換性が無いことを受けて、新しい QAtomic 系クラスに対応していないアーキテクチャへのサポートの将来的な停止が Qt Core モジュールのメンテナである Thiago Macieira から提案されました。

現在その対象となっているのは以下のアーキテクチャです。

  • Integrity
  • VxWorks
  • Alpha
  • Blackfin
  • POWER and PowerPC
  • S/390
  • SH-4a
  • SPARC

メールでは 5.1 で利用停止を推奨し、5.2 で古いコードの削除が提案されています。もっとも、削除した場合でも C++11 の std::atomic や gcc の機能を使った実装があるため、それらのアーキテクチャでは全く動かないということにはならないようです。

Qt5 の QtWebKit の SQLite 依存について

WebKit は以前から(Qt に関係無く)、SQLite に依存していたのですが、Qt 5 でその依存性の解決方法を変更したとのことです。QtWebKit 単体でクロスコンパイルや Windows でビルドする場合に影響があるようなので、注意してください。

[Development] heads-up: QtWebKit’s SQLite dependency

新しい方法では以下の順番で検索するそうです。

  1. pkg-config を使って SQLite を検索。ただし、Mac では標準の SQLite を使う。
  2. Qt5 のソースツリー内の QtWebKit をビルドする場合、qtbase/src/3rdparty/sqlite にある SQLite を使う。
  3. SQLITE3SRCDIR 環境変数が指し示す SQLite を使う。