特集
» 2004年12月15日 20時00分 公開

UNIX USER1月号「デスクトップで動かす・学ぶQt/Embedded」より転載:Qtとは――第1回 フレームバッファでQtアプリ(その1) (2/3)

[杉田研治,UNIX USER]
Qt/Embeddedとは

 Qt/Embeddedに絞って、もう少し詳しくその機能を見てみましょう。

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)。

表3 Qtの提供する主な機能の分類と内容
分類 内容
基本ウィジェット ボタン、ラベル、メニューなどの基本的ウィジェット
高機能ウィジェット テーブル、リストボックス、プログレスバーなどの高機能ウィジェット
標準ダイアログ 色選択、エラーメッセージ、ファイルダイアログ、
フォントダイアログ、メッセージボックス、タブダイアログ
レイアウト管理 ウィジェットのレイアウト処理
グループ化 ボタングループ、スプリッタ、タブウィジェット、
ウィジェットスタック、ウィザード
描画、印刷 ペインタ、キャンバス、色管理、フォント、OpegGL、イメージ
GUIスタイル Aqua/CDE/Mac/MotifPlus/Motif/SGI/Platinum/PockectPC/Windowsのビルトイン GUIスタイル、カスタム GUIスタイルフレームワーク
アプリケーション アプリケーション制御、アクション、ドック、メインウィンドウ、
メニューバー、ツールバー、マルチウィンドウインターフェイス
環境

クリップボード、国際化翻訳メッセージ、
セッション管理などのクラスとウィジェット

イベント イベントハンドラ、イベントループ、タイマーなどのクラス
ヘルプ機能 ステータスバー、バルーンヘルプ、ヘルプテキスト
ドラッグ&ドロップ テキストやイメージなどのドラッグ&ドロップ
オブジェクトモデル メタオブジェクト、プロパティ、ガードポインタ、バリアント
スレッド ミューテックス、スレッド、セマフォ、
スレッドストレージ、ウェイトコンディション
ファイル入出力 ファイルとディレクトリのアクセス、ファイル入出力、
国際化テキスト処理、シリアライゼーション
ネットワーク ソケット、FTP、HTTP、URLアクセス
データベース

リレーショナルデータベースのラッパークラスと
データベース用ウィジェット

イメージサウンド ピックスマップ、アイコン、動画、スタイルシート、
アフィン変換、プリンタ、サウンド再生
テキスト ロケール、リッチテキスト、スタイルシート、
シンタックスハイライト、テキストブラウザ、テキストエディット
ユーティリティ キャッシュ、辞書、コンテナ、国際化文字列、正規表現
日付と時刻 日付と時刻のクラスとそれらの編集用ウィジェット
XML DOMとSAX関連のXMLパーサー

表4 配布ソースに同梱されているドキュメント類
ソースコード内のパス 内容
examples/ Qt APIの使用例
qmake/examples/ qmakeのサンプルコード
tools/designer/examples/ Qt Designerのサンプル
tutorial/ Qtプログラミングのチュートリアル
tools/linguist/tutorial/ Qt Linguistのチュートリアル

Qt/Embeddedのターゲット

 Qt/Embeddedがターゲットとする組み込み環境は、ある程度ハードウェアのスペックに余裕があり、デスクトップ環境と同じような機能が求められる場合、つまり、組み込みで高機能なGUIが必要とされるような領域です。また、Qt自体がUNIXをメインターゲットの1つとしているので、UNIX/Linuxにおける高い開発効率とプログラミングのしやすさという恩恵を受けられるのも大きな利点です。

Qtとの相違

 Qtは、マルチプラットフォームを考えて設計されているので、ほとんどのコードをQt APIで記述できます。しかし、Qt/Embeddedはウィンドウシステムのない環境で用いることからも類推できるように、デスクトップのQtといくつか相違があります。

  • ウィンドウマネージメント機能

 デスクトップ上では、ウィンドウシステムがGUIアプリケーションのウィンドウや、キーボードとマウスのイベントを管理します。Qt/Embeddedでは、最初に起動されたアプリケーションがこれらの機能をサーバーとして提供し、それ以降起動されるものも含め、すべてのアプリケーションは、このサーバーとのやり取りによって、ウィンドウ操作やイベント処理を行います。

 最初に起動するアプリケーションでサーバー機能を提供するには、次のように「-qws」オプションを指定して起動します。

$ ./hello -qws

 以降のアプリケーションは、「-qws」を付けずに起動します。

 なお、QApplicationオブジェクト生成時にQApplication::GuiServerを指定することでも、同様にサーバー機能が有効になります。

  • ウィンドウ装飾

 ウィンドウの枠やタイトルバーなどのウィンドウ装飾は、一般にウィンドウシステムが行いますが、Qt/Embeddedでは、Qt/Embeddedのウィンドウマネージメント機能がウィンドウ装飾をします。しかし、組み込み向けの用途では、デスクトップ環境のようなウィンドウ操作は必要とされないので、デスクトップ版ほどの自由度は省かれています。デスクトップ版のようなウィンドウ装飾が必要ならば、QWSDecoration*をサブクラス化して、Qtのウィンドウマネージメント機能をカスタマイズすれば良いでしょう。

  • Qt/Embedded特有のクラス

 リスト1は、Qt/Embedded特有のクラスの一部です。Qtのアプリケーションレベルのプログラムでは使用しませんが、タッチパネルドライバ用にQWSMouseHandlerのサブクラス化や、フレームバッファのレイアウトに合わせたQLinuxFbScreenのカスタマイズが必要な場合もあります。

 また、アプリケーションレベルで、Qt/Embeddedのサーバー機能を介したQCopChannelによるアプリケーション間通信やQDirectPainterを用いて、Qtの描画処理を介さずに直接フレームバッファにアクセスして高速な描画を行うこともあります。

  • Qt/Embeddedで制限のある機能

 Qt/Embeddedでは、デスクトップ環境に特有な機能は使用できません。機能上の制限は表5のようになります。

リスト1 Qt/Embedded特有のクラス(一部)
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

表5 Qt/Embeddedで制限のある機能
機能 制限の概要
プラットフォームに特有な機能 ActiveQt、Motif Extension、OpenGLなどのQtのモジュールはサポートされない
日本語入力 ソフトウェアキーボードや日本語入力エンジンを組み込む必要がある。Qt/Embedded向けの商用のものも出てきている
最大フォントサイズ 127ピクセル前後が最大サイズ(フットプリント削減のためフォントサイズを保持する変数がQt/Embeddedでは1バイトのため)
マルチヘッド 実験的な実装。複数フレームバッファを扱うには、別途パッチが必要

このページで出てきた専門用語
X11サーバーなどのウィンドウシステムを動かすツールキットと比べて
最近では、軽量X11サーバーが全体コストを考えて見合う場合やX11のXlibでフレームバッファに直接アクセスする方法もあり、組み込み向けのQtの選択肢が複雑化してきている。

QWSDecoration
QWSDecorationは、Qt/Embeddedに特有のクラスなため、プラットフォーム間の互換性はない。

Copyright(c)2010 SOFTBANK Creative Inc. All rights reserved.

注目のテーマ