検索
特集

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

組み込みでのGUIアプリケーションは、ウィンドウシステムがない環境で動き、組み込みボードやタッチパネルなどの小型表示装置が用いられることが多いため、これまでは興味があっても簡単に手が出せませんでした。しかし最近は、Linux環境でフレームバッファが利用できるようになり、デスクトップマシンで組み込みGUIを体験できるようになっています。本連載では、Qt/Embeddedを使って、Linuxデスクトップマシンで組み込みのGUIプログラミングを体験します。

Share
Tweet
LINE
Hatena

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

分類 内容
基本ウィジェット ボタン、ラベル、メニューなどの基本的ウィジェット
高機能ウィジェット テーブル、リストボックス、プログレスバーなどの高機能ウィジェット
標準ダイアログ 色選択、エラーメッセージ、ファイルダイアログ、フォントダイアログ、メッセージボックス、タブダイアログ
レイアウト管理 ウィジェットのレイアウト処理
グループ化 ボタングループ、スプリッタ、タブウィジェット、ウィジェットスタック、ウィザード
描画、印刷 ペインタ、キャンバス、色管理、フォント、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のターゲット

 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のようになります。

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
リスト1 Qt/Embedded特有のクラス(一部)
機能 制限の概要
プラットフォームに特有な機能 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.

ページトップに戻る