はじめに
これまで4回に渡ってQtの基本部分について説明して来ました。今回と次回は,Qt WebKitでのブラウザ機能の利用方法,そして,ブラウザ機能とQtのウィジェットを混在して利用する方法について説明します。前回の後に来年1月にリリース予定のQt 4.5のTechnology Previewが2008/10/21にリリースされているので,これについても触れておきます。
- ※) Qt 4.5 Technology Previewの前日にSymbian OSへの移植もアナウンスされています。また,Nokiaへの買収に伴い,社名がTrolltechからQt Software, Nokiaに変更されWebページも一新されました。
Qt 4.5 Technology Preview
Technology Previewには,Qt 4.5で予定されている改善や機能がすべて盛り込まれてはいませんが,いくつかを実際に確認できます。ただし,改善点や新しい機能の評価用というのがTechnology Previewのリリース目的なため,落ちてしまったり今まで通りには動かないことがあります。
パフォーマンス改善
Qt 4.4まででは,2D描画機能のバックエンドの描画エンジンとして,それぞれのプラットフォームの描画機能とOpenGL を利用できます。何もしなければ各プラットフォームの描画機能が使われ,以下のようにすればOpenGLを2D描画に使って描画速度を改善できるようになっています。
- Graphics View
setViewpor(QGLWidget(QGLFormat(QGL::SampleBuffers))) を呼び出す。 - ウィジェット
QGLWidget(QGLFormat(QGL::SampleBuffers)) を親ウィジェットにする。
描画精度や描画速度を上げようとすると3つの問題があります。
- プラットフォーム固有の描画機能には,描画上で細かな差異があります。そこで,プラットフォームに依存せずに正確な描画をしたい場合には,QImageに描画をしてからQImageを表示するという方法を取ることとなります。しかし,一般にQImageがクライアントアプリケーション中に存在するデータということから,プラットフォームによっては描画コストが高くなります。
- OpenGLを描画エンジンにすると速度は改善されますが描画精度が落ちます。正確な描画のためには各プラットフォームの描画エンジンを用いるか,1)の方法を取ることとなります。
- OpenGLを描画エンジンに使用するには,僅かな修正ですがすべてのウィジェットのベースクラスを変更しなければなりません。アプリケーション全体で簡単にOpenGLを描画エンジンに切換える方法はありません。
Qt 4.5 Technology Previewではこれらの問題への解決が試みられています。ひとつは,ラスター(つまりQImageを使用した描画と表示)とOpenGLをアプリケーションの描画エンジンとして使用できるようにする機能です。
$ app -graphicssystem raster $ app -graphicssystem opengl
使い方は簡単で,上記のようにアプリケーション起動時のパラメータに指定するだけで,アプリケーションのソースコードの変更は要りません。Qt Labs Blogsに掲載されている描画エンジンのベンチマーク結果は以下のようになっています。
表1 2D描画バックエンドのベンチマーク(単位:Fps)
| 描画エンジン | Windows | X11 | Mac OS X |
|---|---|---|---|
| プラットフォームの描画機能 | 60 | 20 | 9 |
| ラスター | 60 | 36 | 30 |
| OpenGL | 245 | 92 | 215 |
一般に,QPixmapの実装には描画速度に適した画像リソースを使い,QImageはアプリケーション空間のデータに持ってラスター操作に適したデータとして扱うようにしていますが,ラスター描画エンジンのベンチマーク結果に違いがあります。
Windowsでラスター描画エンジンの効果がないのは,Windowsでは元々ラスター描画をしているためです。実際,WindowsでのQPixmapの実装はラスターとなっていて,QImageを内部に抱えているような構造になっています。
X11では,QPixmapはX Window Systemのサーバ側のリソースPixmapで,QImageはラスターデータXImageとなっているので,単にラスター描画をするだけではQImageをサーバ側に転送するためかなりのボトルネックになります。Qt 4.5 Technology Preview では,X Shared Memory Extension(MIT-SHM)を使い,同一ホスト内のアプリケーションであれば,サーバへの転送を避けるようにしています。MIT-SHMを利用するようになったので,QPixmapとQPixmapの相互変換も改善されるはずで,計測してみると次のようになりました。
表2 X11でのQPixmapとQImageの変換処理のベンチマーク(単位 ms)
| 4.4.3 | 4.5 TP1 | 4.4.3 | 4.5 TP1 | |
|---|---|---|---|---|
| QPixmap::toImage() | 9286 | 0 | 26685 | 0 |
| QPixmap::fromImage() | 9185 | 814 | 31185 | 3450 |
かなりの改善結果です。画像のスケールをスライダで変えて表示するコードを書いて,サイズが3000×3000の画像で,X11でラスター描画エンジンを試してみると,OpenGLを描画エンジンにしたのと同じように滑らかにスケールが変わるようになっています。
描画速度は改善されるのですが,問題はあります。ラスター描画エンジンを使用して,イメージを表示しようとして読み込むと,ボタンのテキストが文字化けをしたりします。また,OpenGLを描画エンジンにする機能は,4.5ではまだ実験的なレベルとなるそうです。OpenGLを使用しているプログラムに対して,グラフィックスシステムにOpenGLを指定すると,OpenGLで描画する図形がずれて表示されたりするなどの問題がありました。一方,ラスター描画エンジンは全プラットフォームでフルサポートされます。
- ※) Windowsでの2D描画には,Direct Xも実験的に描画エンジンとして用いられるようになっています。ただし,ウィジェットが表示されない場合があるなどの問題があります。
- ※) MIT-SHMを使うコードは,Qt 1から書かれてはいます。
WebKitの改善
第1回で挙げた機能やキャッシュが実装されていて,YouTubeなどで動画の再生がデスクトップ版のQtだけではなくWindows CEでもできるようになっています。
その他
ざっと見ただけですが,以下のような追加がされていました。
- Qt/Mac OS XのCocoaブランチの取り込み。
- QtTestモジュールへのベンチマーク機能の追加。
- QtXmlPatternsモジュールでのXSL-Tサポート。
- ODF (Open Document Format) のサポート。
- Qt Designerの操作性改善
- Qt/Mac OS Xでのバンドル作成支援ツールmacdeployの追加。
- リファレンスマニュアルへのQt for Windows CEについての記述の追加。

