Qt/Embeddedに絞って、もう少し詳しくその機能を見てみましょう。
Qtの開発は1991年に始まり、当初はUNIX/X11とWindowsでソースコードの互換性がある、デスクトップ向けのC++ GUIツールキットでした。その後、Mac OS X版も加わり、デスクトップでは合わせて3つのプラットフォームを現在サポートしています。このデスクトップ版のQtをEmbedded Linuxに移植したのがQt/Embeddedで、2000年にリリースされました。
図3に示したように、どのプラットフォームでもQt APIレイヤーは共通です。プラットフォームに固有の部分は、プラットフォーム依存レイヤーで吸収され、共通のQt APIを用いてアプリケーションを作成できます。このような構成のため、Qt/Embeddedでは、デスクトップ向けQtとほとんど同じGUI機能をEmbedded Linuxでも使え、組み込み環境でX11サーバーなどのウィンドウシステムを動かすツールキットと比べて、メモリ使用量を抑えられるという利点があります。さらに、ハードウェアリソースに余裕のあるデスクトップマシンのLinux/X11環境で開発し、ターゲットプラットフォーム向けに改めて調整するという開発形態を取ることも可能です。
このほか、マルチプラットフォームのためには、GUI部分だけでなくファイル処理やネットワークなども共通の枠組みで扱う必要があり、Qtではよく使用される機能がラッパークラスとして提供されています(表3)。
なお、詳細については、配布ソースに同梱されているHTML形式のリファレンスマニュアルを参照してください。ドキュメントは詳しく丁寧に書かれていて、実践的なチュートリアルとサンプルコードもたくさん同梱されています(表4)。
| 分類 | 内容 |
|---|---|
| 基本ウィジェット | ボタン、ラベル、メニューなどの基本的ウィジェット |
| 高機能ウィジェット | テーブル、リストボックス、プログレスバーなどの高機能ウィジェット |
| 標準ダイアログ | 色選択、エラーメッセージ、ファイルダイアログ、フォントダイアログ、メッセージボックス、タブダイアログ |
| レイアウト管理 | ウィジェットのレイアウト処理 |
| グループ化 | ボタングループ、スプリッタ、タブウィジェット、ウィジェットスタック、ウィザード |
| 描画、印刷 | ペインタ、キャンバス、色管理、フォント、OpegGL、イメージ |
| GUIスタイル | Aqua/CDE/Mac/MotifPlus/Motif/SGI/Platinum/PockectPC/Windowsのビルトイン GUIスタイル、カスタム GUIスタイルフレームワーク |
| アプリケーション | アプリケーション制御、アクション、ドック、メインウィンドウ、メニューバー、ツールバー、マルチウィンドウインターフェイス |
| 環境 | クリップボード、国際化翻訳メッセージ、セッション管理などのクラスとウィジェット |
| イベント | イベントハンドラ、イベントループ、タイマーなどのクラス |
| ヘルプ機能 | ステータスバー、バルーンヘルプ、ヘルプテキスト |
| ドラッグ&ドロップ | テキストやイメージなどのドラッグ&ドロップ |
| オブジェクトモデル | メタオブジェクト、プロパティ、ガードポインタ、バリアント |
| スレッド | ミューテックス、スレッド、セマフォ、スレッドストレージ、ウェイトコンディション |
| ファイル入出力 | ファイルとディレクトリのアクセス、ファイル入出力、国際化テキスト処理、シリアライゼーション |
| ネットワーク | ソケット、FTP、HTTP、URLアクセス |
| データベース | リレーショナルデータベースのラッパークラスとデータベース用ウィジェット |
| イメージサウンド | ピックスマップ、アイコン、動画、スタイルシート、アフィン変換、プリンタ、サウンド再生 |
| テキスト | ロケール、リッチテキスト、スタイルシート、シンタックスハイライト、テキストブラウザ、テキストエディット |
| ユーティリティ | キャッシュ、辞書、コンテナ、国際化文字列、正規表現 |
| 日付と時刻 | 日付と時刻のクラスとそれらの編集用ウィジェット |
| XML | DOMとSAX関連のXMLパーサー |
| 表3 Qtの提供する主な機能の分類と内容 | |
| ソースコード内のパス | 内容 |
|---|---|
| examples/ | Qt APIの使用例 |
| qmake/examples/ | qmakeのサンプルコード |
| tools/designer/examples/ | Qt Designerのサンプル |
| tutorial/ | Qtプログラミングのチュートリアル |
| tools/linguist/tutorial/ | Qt Linguistのチュートリアル |
| 表4 配布ソースに同梱されているドキュメント類 | |
Qt/Embeddedがターゲットとする組み込み環境は、ある程度ハードウェアのスペックに余裕があり、デスクトップ環境と同じような機能が求められる場合、つまり、組み込みで高機能なGUIが必要とされるような領域です。また、Qt自体がUNIXをメインターゲットの1つとしているので、UNIX/Linuxにおける高い開発効率とプログラミングのしやすさという恩恵を受けられるのも大きな利点です。
Qtは、マルチプラットフォームを考えて設計されているので、ほとんどのコードをQt APIで記述できます。しかし、Qt/Embeddedはウィンドウシステムのない環境で用いることからも類推できるように、デスクトップのQtといくつか相違があります。
デスクトップ上では、ウィンドウシステムがGUIアプリケーションのウィンドウや、キーボードとマウスのイベントを管理します。Qt/Embeddedでは、最初に起動されたアプリケーションがこれらの機能をサーバーとして提供し、それ以降起動されるものも含め、すべてのアプリケーションは、このサーバーとのやり取りによって、ウィンドウ操作やイベント処理を行います。
最初に起動するアプリケーションでサーバー機能を提供するには、次のように「-qws」オプションを指定して起動します。
$ ./hello -qws
以降のアプリケーションは、「-qws」を付けずに起動します。
なお、QApplicationオブジェクト生成時にQApplication::GuiServerを指定することでも、同様にサーバー機能が有効になります。
ウィンドウの枠やタイトルバーなどのウィンドウ装飾は、一般にウィンドウシステムが行いますが、Qt/Embeddedでは、Qt/Embeddedのウィンドウマネージメント機能がウィンドウ装飾をします。しかし、組み込み向けの用途では、デスクトップ環境のようなウィンドウ操作は必要とされないので、デスクトップ版ほどの自由度は省かれています。デスクトップ版のようなウィンドウ装飾が必要ならば、QWSDecorationをサブクラス化して、Qtのウィンドウマネージメント機能をカスタマイズすれば良いでしょう。
リスト1は、Qt/Embedded特有のクラスの一部です。Qtのアプリケーションレベルのプログラムでは使用しませんが、タッチパネルドライバ用にQWSMouseHandlerのサブクラス化や、フレームバッファのレイアウトに合わせたQLinuxFbScreenのカスタマイズが必要な場合もあります。
また、アプリケーションレベルで、Qt/Embeddedのサーバー機能を介したQCopChannelによるアプリケーション間通信やQDirectPainterを用いて、Qtの描画処理を介さずに直接フレームバッファにアクセスして高速な描画を行うこともあります。
Qt/Embeddedでは、デスクトップ環境に特有な機能は使用できません。機能上の制限は表5のようになります。
QFontManager
QDiskFont
QRenderedFont
|_ QRenderedFontBDF
|_ QRenderedFontTtf
QFontFactory
|_ QFontFactoryBDF
|_ QFontFactoryTtf
QGlyph
QMemoryManagerPixmap
QMemoryManager
QScreen
|_ QLinuxFbScreen
|_ QMachScreen
|_ QMatroxScreen
|_ QTransformedScreen
|_ QVga16Screen
|_ QVoodooScreen
|_ QRepeaterScreen
|_ QSNAPScreen
|_ QVfbScreen
QScreenCursor
|_ QMachCursor
|_ QMatroxCursor
|_ QRepeaterCursor
|_ QVFbScreenCursor
|_ QVga16Cursor
|_ QVNCScreenCursor
|_ QVoodooCursor
QGfx
|_ QGfxVfb
|_ QGfxTransformedRaster
Qlock
QLockHolder
QDirectPainter
QWSSoundServer
QWSWindow
QWSKeyboardHandler
QWSMouseHandler
|_ QWSBussMouseHander
|_ QWSCalibratedMouseHandler
| |_ QWSLinuxTPMouseHandler
| |_ QWSSVr41xxMouseHandler
|_ QWSPcMouseHandler
|_ QWSYopyMouseHandler
QWSDisplay
QWSServer
QWSClient
QWSDisplayData
QWSCommands
QCopChannel
QWSManager
QWSDecoration
QWSPropertyManager
QWSRegionManager
QWSSocket
QWSServerSocket
| 機能 | 制限の概要 |
|---|---|
| プラットフォームに特有な機能 | ActiveQt、Motif Extension、OpenGLなどのQtのモジュールはサポートされない |
| 日本語入力 | ソフトウェアキーボードや日本語入力エンジンを組み込む必要がある。Qt/Embedded向けの商用のものも出てきている |
| 最大フォントサイズ | 127ピクセル前後が最大サイズ(フットプリント削減のためフォントサイズを保持する変数がQt/Embeddedでは1バイトのため) |
| マルチヘッド | 実験的な実装。複数フレームバッファを扱うには、別途パッチが必要 |
| 表5 Qt/Embeddedで制限のある機能 | |
X11サーバーなどのウィンドウシステムを動かすツールキットと比べて: 最近では、軽量X11サーバーが全体コストを考えて見合う場合やX11のXlibでフレームバッファに直接アクセスする方法もあり、組み込み向けのQtの選択肢が複雑化してきている。
QWSDecoration: QWSDecorationは、Qt/Embeddedに特有のクラスなため、プラットフォーム間の互換性はない。
Copyright(c)2010 SOFTBANK Creative Inc. All rights reserved.