Windows で Qt5 が遅いわけ

Windows で Qt5 を使ってみて遅くなったと感じたことはありませんか。Qt Quick 2 を使っていて遅い場合は ANGLE が問題になっていることも多いのですが、Widget ベースのアプリではどうでしょうか。qt-project.org の interest メーリングリストで Qt5 が Qt4 に比べて明らかに遅くなっていたという話題が出てましたので、ちょっと紹介してみます。

それからもう一つ、Qt5 に限らないと思いますが MinGW 版のバイナリが Visual Studio 版よりも遅いことについての話とその対策案も紹介します。

“Windows で Qt5 が遅いわけ” の続きを読む

QML エンジンの進化 その1

QML は JavaScript をベースに作成された言語です。そのため、QML の言語処理系には JavaScript エンジンを使用しています。Qt4 では JavaScriptCore を、Qt5 ではより速度を求めて V8 JavaScript Engine を採用しました。Qt5 では V8 の採用とそれ以外の最適化などで Qt Quick のパフォーマンス向上を果たしましたが、徐々にその限界も見えつつあります。その限界と次のステップを解説する第一弾として “Evolution of the QML engine, part 1” が Qt Blog に投稿されました。面白い記事ですので、ざっくりと訳してみることにします。

さて、現状の V8 の利用にどのような問題があるのでしょうか

“QML エンジンの進化 その1” の続きを読む

Qt 5.0.2 リリース

Qt 5.0 系のパッチリリースとなる 5.0.2 がリリース されました。多くのバグ修正が行われていますが、主なものはバイナリパッケージやビルドに関連するもののようです。

  • VS2012 でビルドした Windows 用バイナリパッケージ(ANGLE 版) と VS2010 でビルドした Windows 用バイナリパッケージ(デスクトップ OpenGL 版)
  • 同梱する Qt Creator を 2.7.0 に更新
  • configure 時に -skip オプションでビルドしないモジュールの選択が可能に
  • static ビルド対応
  • その他 600 以上の改善

これまでは Windows 版のバイナリパッケージは ANGLE 版しかなく問題も色々と発生していましたが、デスクトップ OpenGL 版も用意されました。OpenGL 系の機能を使う方は ANGLE 版ではなく OpenGL 版を使用してください。

Qt のプロパティシステム

Qt のオブジェクトシステム( QObject と関連クラス)にはプロパティのシステムが用意されています。C++ だけを使用してプログラムするときには意識する必要はほとんどありませんが、Qt Script や Qt WebKit、QML などが C++ と連携する場合には非常に重要な仕組みです。この記事では Qt のプロパティシステムと、Qt 5.1 で追加される MEMBER 指定子について簡単に説明します。

プロパティとは

まず、プロパティとは何でしょうか。プロパティはオブジェクトの属性のことです。例えば、QWidget であればその幅( width )や高さ( height )、QLabel であればその文字列( text )などがプロパティになります。

C++ ではそれらのプロパティの値は getter と呼ばれる関数を通じて取得し、setter と呼ばれる関数で設定します。先ほどの QLabel の場合、QLabel::text() が getter で、QLabel::setText() が setter になります。このように C++ ではメンバー関数を通じて利用するために getter で取得する値がプロパティかどうかは意識することはまずありませんが、たとえば QML でアクセスする場合には getter / setter はエンジン側で自動的に使用され、ユーザーからはプロパティは変数のように見えます。

“Qt のプロパティシステム” の続きを読む

Qt 5.1 の OpenGL

KDAB のブログで “OpenGL in Qt 5.1” というシリーズの記事が公開されています。

Qt 5.1 の OpenGL についての解説というタイトルになっていますが、Part 1 では Qt4 での OpenGL と Qt5 の違いなども記載されていますので、Qt で OpenGL を使っている人には Qt5 の現状を把握するにはちょうど良い記事になっていると思います。OpenGL 3 以降の機能を使うクラスの紹介などもあるので、若干デスクトップ寄りなスタンスではありますが。

“Qt 5.1 の OpenGL” の続きを読む

QtWayland のロードマップ

qt-project.org の development メーリングリストに QtWayland の現状とロードマップがポストされました。QtWayland は Qt5 を Wayland 上で動かすためのクライアント(QPA)プラグインと Wayland 上で Qt を使って Compositor を作るための QtCompositor API を開発しているプロジェクトです。

いくつかの問題はあるものの、現状では Qt 5.1 のリリースに合わせて(あるいは直後に) QtWayland 5.1 をリリースするために準備をしているところだそうです。5.1 では基本的には QPA プラグインの提供が主で、QtCompositor は API の変更が行われるかもしれないため、experimental リリースとなるそうです。なお、wayland QPA プラグインは Qt5 が OpenGL を必須とすることから、wayland-egl が必要となります。

その後の QtWayland 5.2 では QtCompositor API や Window decorations API の改良、Wayland Input Method のサポート、テストの追加などが予定されているようです。

上記のロードマップは反映されていませんが、QtWayland に関しては wiki の記述も参考にしてください。

なお、Wayland Input Method に関しては Mallit の wiki や FOSDEM 2013 のスライド などが参考になるでしょう。

Android で Coffice を

Coffice とは Calligra Office(あるいは coffee-in-office)の略で、Calligra(KOffice から派生した KDE 用のオフィススイート)をモバイル端末で動かそうというプロジェクトです。

KDE 用アプリである Calligra の Words をベースに、KDE 部分を簡単なラッパークラスで置き換えて、Qt(Necessitas) のみで ODT ビューアとして動くようにしたものが現在の Coffice となります。

Google Play から既に入手が可能なので少し試してみました。少し大きなファイルだとパフォーマンスが劇的に低下したり、ピンチで拡大しようとすると表示が消えたり汚かったり、落ちたりとまだまだパフォーマンス的にも機能的にも実用にはなりませんが、日本語の ODT ファイルを表示させることも出来ました。今後、プロジェクトが成長していき、編集なども可能になれば面白い存在になるかもしれません。

2013-03-25 22.34.34

Qt5 for iOS / Android

少し古い記事の事なので、チェック済みの方も多いとは思いますが、Qt 5.1 へ向けて iOS と Android 対応のコードがマージされ始めました。

やはり注目度は高いようで、どちらの記事も非常にたくさんコメントされています。

5.1 へ向けてといったものの、5.1 ではどちらもプレビュー版となり、正式に対応するのは早くても 5.2 となる予定です。記事としては iOS 版が先に公開されましたが、Necessitas というベースがあった Android 版の方が開発は進んでいるようで、Android 版では QtQuick 2 やメディアプレイヤーも動いています。iOS 版では V8 JavaScript エンジンを動かす技術的な目処がまだたっていないようで、QtQuick 1 止まりです。

どちらも現状ではソースからビルドする必要がありますが、気になる人はぜひ試してみてください。

“Qt5 for iOS / Android” の続きを読む

QWidget::createWindowContainer()

Qt5 になって GUI 関連のアーキテクチャが変更されたことで、QtQuick を表示する QQuickView は QWindow の派生クラスとなりました。Qt4(QtQuick1)の QDeclarativeView は QWidget の派生クラスですから、この辺りの構成は大きく変化したことになります。

これに伴って qt-project.org のフォーラム等でよく見る質問の一つが QWidget の中に QtQuick2 を埋め込みたいと言うものです。これまではこの問題を解決する手法はありませんでしたが、Qt 5.1 で QWidget::createWindowContainer() というメソッドが追加されることになりました。

QQuickView *view = new QQuickView();
...
 
QWidget *container = QWidget::createWindowContainer(view);
container->setMinimumSize(...);
container->setMaximumSize(...);
container->setFocusPolicy(Qt::TabFocus);
 
widgetLayout->addWidget(container);

これは QWindow を引数に渡して、その表示を行う QWidget を生成するメソッドです。基本的に表示のために埋め込むものなので、QWindow と QWidget 間の連携には制限がありますが、これまでの全く出来なかった状態よりはましでしょう。