Qtとは

Linux用のGUIアプリケーションの開発ツールとしては、GTK+とQtが有名です。
QtはTrolltech社で開発が進み、その後Nokia社が買い取って開発を行っています。
Qtの特徴は
・クロスプラットフォーム ひとつのソースコードで、Linux、Microsoft Windows、Mac OS、ARMなどでの開発が出来る。
・C++とクラスライブラリ 充実したクラスライブラリが準備された、C++をベースの開発ツール。
・統合開発ツール   統合IDEのQt Creator、フォーム設計のQt Designer、豊富なヘルプ、サンプルが用意されている。
・GPL、LGPLライセンス 充実した機能がGPL、LGPL、商用ライセンスで提供されている。
などがあげられます。
詳しくは、こちら

Qt Embeddedとは

Qt Embeddedは、x86やARM、MIPSを対象とした組み込みシステム開発環境を提供します。つまり各ターゲット用のライブラリソースが公開されています。 また、資源の少ない組み込み機器用にXウィンドウサーバーを使わず、フレームバッファーに直接書き出す方式をとっています。
Androidの登場以来、この分野では、すっかりAndoroidに持っていかれた感がありますが。
ただ、VisualC+++MFCの経験がある方なら、とても取り組み易いと思います。

Qtのインストール

最初に、x86ホスト用のQtをインストールします。
Qt のダウンロード から、Linux/X11の適当なバージョンををダウンロードし、展開、READMEの内容に従ってインストールします。
Ubuntuを使っている場合は、Synapticを起動してクイック検索でqtcreatorを検索してチェックすれば必要なものが一括でインストールされます。
Synapticからインストールすると最新バージョンではありませんが、問題ないと思います。(Ubuntu11.04現在)

ここでとりあえず、Qtを起動して動作を確認してみてください。
Synapticからインストールした場合、/usr/share/にqt4 qtcreatorなどがインストールされていると思います。インストール場所も確認しておいてください。

Qt Linux/X11版が正常に動くことが確認できたら、次にQt x.x.x for Embedded Linuxをインストールします。 (2011/09現在の最新版はqt-everywhere-opensource-src-4.7.4です)
インストールの詳しい手順は、Installing Qt for Embedded Linux に有ります。
また、Qt Embedded をBeagleboard用にインストール手順は、Building Qt に有ります。

解凍し、設定ファイルを複製します
gunzip qt-everywhere-opensource-src-4.7.4tar.gz
tar xf qt-everywhere-opensource-src-4.7.4tar
cd qt-everywhere-opensource-src-4.7.4/mkspecs/qws
cp linux-arm-gnueabi-g++ linux-omap3-g++

linux-omap3-g++/qmake.confを以下のように編集します
(ここでARMツールチェーンは組み込みLinuxの項での内容を想定しています)
cd linux-omap3-g++
vi qmake.conf

#
# qmake configuration for building with arm-linux-g++
#

include(../../common/g++.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)

# modifications to g++.conf
#Toolchain

#Compiler Flags to take advantage of the ARM architecture
QMAKE_CFLAGS_RELEASE = -O3 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp
QMAKE_CXXFLAGS_RELEASE = -O3 -march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp

QMAKE_CC = arm-linux-gnueabi-gcc
QMAKE_CXX = arm-linux-gnueabi-g++
QMAKE_LINK = arm-linux-gnueabi-g++
QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++

# modifications to linux.conf
QMAKE_AR = arm-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = arm-linux-gnueabi-objcopy
QMAKE_STRIP = arm-linux-gnueabi-strip

QMAKE_INCDIR =
QMAKE_LIBDIR =

load(qt_config)


mkspecs/にdefaultという名前のqws/linux-omap3-g++へのシンボリックリンクを作成します。
最初、このdefaultのリンクはうまくリンクしていません、一度削除して作った方が間違いないかも知れません。

cd ..
ln -s qws/linux-omap3-g++ default
要は、上記の内容を書いたqmake.confとqplatformdefs.h が入った適当なディレクトリがmkspecs/qws/以下にあって、 このディレクトリを指すdefaultと言う名前のシンボリックリンクが、mkspecs/にあれば良いことになります。

configuerを実行します
./configure -prefix PATH -embedded arm-gnueabi -platform /qws/linux-x86-g++ \
-xplatform /qws/linux-omap3-g++ \
-depths 16,24,32 \
-little-endian \
-host-little-endian \
-no-mmx \
-no-3dnow \
-no-sse \
-no-sse2 \
-no-glib \
-no-cups \
-no-largefile \
-no-accessibility \
-no-openssl \
-no-gtkstyle \
-nomake examples \
-nomake demos \
-qt-mouse-pc \
-qt-mouse-linuxtp \
-qt-mouse-linuxinput \
-plugin-mouse-linuxtp \
-plugin-mouse-pc \
-fast

-prefix PATHにインストール先を指定します。指定しなければ /usr/local/Trolltech以下にインストールされます。
-embeddedにはarmを指定するように書いてありますがエラーになってしいました。arm-gnueabiにすると通るようです。
-nomake example -nomake demos を指定するとサンプル、デモがインストールされません、サンプルが必要ならこのパラメータをはずします。 ただし、コンパイルに数時間を要します。

メイクしてインストールします

make
sudo make install

以上で、Qt Embeddedのインストールは完了です。
-prefixで指定したパス以下、あるいは/usr/local/Trolltech/QtEmbedded-4.7.4-generic/binにqmakeがあることを確認しておいてください。
また、QtEmbedded-4.7.4-generic/mkspecs以下に、先ほど設定したdefaultのシンボリックリンクが同じ構成で存在することを確認してください。

Qtの設定

Qtを起動し、ツール>オプションを選び、オプションダイアログを開き左パネルのQt4を選びます。
画像Qt-option
「自動検出」と「マニュアル」の二つの項目があると思います。
自動検出の項目には、「PATHに含まれるQt」として、qmakeのフルパスがあると思います。これがホストマシン用のqmakeです。
「マニュアル」の項目を選んで、右の+ボタンをクリックます。
バージョン名に適当な名前、例えばQt-embなどを入力します。
qmakeへのパスの項目で先ほどインストールしたQt Embededのqmakeのパスを入力するか、参照ボタンを押してファイルダイアログからqmakeを選びます。
例えば、/usr/local/Trolltech/QtEmbedded-4.7.4-genelic/biin/qmakeなど
この状態で、デバッグヘルパに緑色のチェックがついていないので、リビルドをクリックします。少し時間が掛かります。
デバッグヘルパに緑のチェックが付き、Qtバージョン・・・見つかりました、に替わればOKです。
これでQt Embeddedを使う準備が整いました。

Qt Embeddedのテスト

「ファイル>プロジェクトの新規作成」をクリックすると「新規作成のダイアログ」が開きますので、 「Qt C++プロジェクト」と「Qt GUI アプリケーション」を選びます。
画像Qt-newfilw1

プロジェクト名とパスを入力します。
画像Qt-newfile2

Qtバージョンダイアログで、「PATHに含まれているQt」と先ほど追加した「Qt-emb」の両方がチェックされていることを確認してください。
画像Qt-newfile3

自動的に、Qt GUIのスケルトンが作成されています。ヘッダー、ソースなどを展開して目を通しておいてください。
画像Qt-newfile4

サイドバーのフォームを展開し、mainwindow.uiをダブルクリックし、Qt Designerを開きます。
画像Qt-newfile5

ウィジェットボックスの「DisplatWidgets」の中から「Label」を選択してフォーム上にドラッグ&ドロップします。
同じ様に「Buttoms」から「Push Buttom」をドラッグ&ドロップします。
このPush Buttonを選択して、右クリックしてコンテキストメニューの中の「スロットへ移動」をクリックします。
すると、mainwindow.cppのコードエディタに切り替わり、中身が空のMainWindow::on_pushButton_clicked()関数が自動で追加されています。
このon_pushButton_clicked()関数の中に
ui->label->setText("Hello World !");
の一行を打ち込みます。
画像Qt-newfile6

「ビルド>すべてビルド」を選ぶか、左パネルのハンマーアイコンをクリックしてビルドします。
エラーが無くビルドが終了したら、ビルド>実行か左パネルの緑色の三角をクリックして実行します。
先ほど、作成したMainWindowが表示されますので、Push Buttonをクリックします。
画像Qt-newfile7

Text LabelがHello World !に替われば成功です。x86の実行ファイルが作成できました。

次に、ARM版hello-armの作成です。
Nautilusなどのファイルブラウザで作成されたファイルを確認しておきます。
hello-armディレクトリに.pro、.cpp、.hなどが入っています。
hello-arm-build-desktopディレクトリのhello-armの実行ファイルが作成されていると思います。
ここで、hello-armと同じディレクトリに適当なディレクトリを作っておきます。例えばhello-arm-crossのような

Qt Creatorに戻り、左パネルのプロジェクトを選び、ビルド設定パネルを開きます。
Qtバージョンの項目は、PATHに含まれるQtが選択されていると思います。
画像Qt-newfile8

右のドロップメニューを展開して、先ほど追加したQt-embを選択します。
ビルドディレクトリに先ほど作成したディレクトリを選択します。
もう一度、ビルドを実行すれば、hello-arm-crossにARM用の実行ファイルが作成されるはずです。

ターゲットマシンへ実装

さて、ここからターゲットマシンへの実装です。
Beagleboard_1 の項で作成した、boot、rootfsのあるSDカードをホストマシンへセットします。
まず、テスト実行ファイルをコピーし、実行権限を与えます。

sudo cp /home//hello-arm-cross/hello-arm /media/rootfs/usr/local/bin/
sudo chmod +x /media/usr/local/bin/hello-arm

Qtで開発したアプリを実行するためには、Qtの実行ライブラリが必要になります。
BeagleboardにSDカードを戻して起動、ターミナルで入り、必要なライブラリをチェックします。

cd /usr/local/bin
ldd hello-arm
libQtGui.so.4 => not found
libQtNetwork.so.4 => not found
libQtCore.so.4 => not found
libpthread.so.0 => /lib/arm-linux-gnueabi/libpthread.so.0 (0x4017e000)
libstdc++.so.6 => /usr/lib/arm-linux-gnueabi/libstdc++.so.6 (0x40192000)
libm.so.6 => /lib/arm-linux-gnueabi/libm.so.6 (0x4023e000)
libgcc_s.so.1 => /lib/arm-linux-gnueabi/libgcc_s.so.1 (0x402aa000)
libc.so.6 => /lib/arm-linux-gnueabi/libc.so.6 (0x402bb000)
/lib/ld-linux.so.3 (0x40064000)

not foundのlibQtGui.so.4、libQtNetwork.so.4、libQtCore.so.4が必要だと分かります。

また、fontも必要になります。
先ほどインストールした/usr/local/Trolltech/QtEmbedded-4.7.4-generic/libの中からターゲットマシンにコピーします。
libQtGui.so.4の実ファイルはlibQtGui.so.4.7.4ですので、コピー後シンボリックリンクを作成します。
もう一度、ホストにSDカードをセットして

sudo cp /usr/local/Trolltech/QtEmbedded-4.7.4-generic/lib/libQtGui.so.4.7.4 /media/rootfs/lib
sudo cd /media/rootfs/lib
sudo ln -s libQtGui.so.4.7.4 libQtGui.so.4

libQtNetwork.so.4、libQtCore.so.4も同様に行います。
fontsもコピーします

sudo cp -r /usr/local/Trolltech/QtEmbedded-4.7.4-generic/lib/fonts /media/rootfs/lib/

ターゲットマシンでの実行

いよいよターゲット上で動かしてみます。
Beagleboardにディスプレイ、キーボード、マウス、準備したSDカードを挿して電源を入れます。

Qt Embeddedでは、最初に起動したアプリケーションがGUIを管理するサーバー機能を提供します。 このサーバー機能を有効するために-qwsオプションを付けて起動します。
また、このサーバーでマウスを有効にするために、QWS_MOUSE_PROTO変数を設定します。

rootでログイン後
export QWS_MOUSE_PROTO="LinuxInput:/dev/input/event1"
hello-arm -qws

hello-armが表示され、PushButtonを押すと、「TextLabel」が「Hello World !」に替われば成功です。
hello-arm、/dev/input/event1のオーナーがrootなので、rootで実行しています。ユーザーで実行するにはchownしておく必要が有ります。
また、BeagleboardでQtを使う場合、USBキーボードとUSBマウスを使うと思いますが、 挿す位置によってevent番号が変わるようです。
cd /dev/input
cat event1
あるいは、
cat event2
として、マウスを動かして反応を確認してください。
運用では、USBマウス位置を固定するか、事前にマウス位置を確認するスクリプトを書く必要がありそうですね。

inserted by FC2 system