ARM環境のQt4とQtopia開発入門
関連リンク:ARM自宅サーバ
|
株式会社 日新テクニカ http://www.nissin-tech.com 更新日: 2011年4月29日 |
QTとはTrolltech社で開発が行われているC++ベースのGUIツールキットです。Linuxのデスクトップ環境はKDEとGNOMEの2つが主流となっていますが、QTはKDEのベースとなっているGUI環境です。KDEはヨーロッパに、GNOMEは米国にファンが多く、KDEはC++で、GNOMEはCでプログラムします。
Qt/Embeddedは組み込み型Linux上で動作するQtのことです。Trolltech社ではQt/Embeddedのほか、Qt /Windows(Windows用)、Qt/X11(PC版Linux用)、Qt/Mac(Macintosh用)など、各種プラットフォーム向けの Qtがあります。
Qtopiaは、Qt/Embeddedを使用して開発されたPDA向けアプリケーション環境で、PIM、Text Editor、アクセサリーなどPDAなどのモバイル機器向けアプリケーションソフトウェアとウィンドウ管理などの機能が含まれています
ライセンスには商用版とオープンソース版があり、現在のオープンソース版のライセンスはLGPL(Qt4.5より)およびGPL である。商用版を購入するとQt 商用ライセンス(Qt Commercial Developer License)でソフトウェアを開発することができる。LGPL版は、2009年3月にリリースされたQt 4.5から提供され始めた。これによりQtは営利企業にとってもより使いやすいライブラリーとなった
- Fedora9.0 開発環境
- Ubuntu10.04LTS 開発環境
- x86用のqtopia-2.2.0をコンパイルと実行する
- ARM用のqtopia-2.2.0をコンパイルと実行する
- 初のqtopiaサンプル(簡易電卓)
- ARM用のQt-4.6.3をコンパイルと実行する
- Qt4版の簡易電卓
- 簡易シリアル・ターミナル
- PWM, Buttons, LEDs, ADCなどのサンプル
- 自分のプログラム・グループを作る
■ Fedora9.0 開発環境
ARM環境のQt開発は初心者にFedora9.0をお勧めします。ほかのLinuxもできますが、いくつの追加パッケージをインストールすることが必要です。
Fedora9のDVDをこちらからダウンロードしてください。
仮想マシンVMware Player環境にFedora9をインストールすれば、次の設定:

Fedora9解像度を1024X768に設定する


■ Fedora9はWindowsのファイルを共有する。
Windows側の共有フォルダを設定する。仮想マシンVMware Player環境なら、仮想マシンは次の設定が必要です。

Fedora側の設定:
「Windows share」に設定する。「192.168.0.3」はwindowsのIPアドレス。「mini2440」はWindows側の共有フォルダ。設定完了した後、「Connect」ボタンを押す。
そのまま「Connect」ボタンを押す。
Fedoraはwindowsの共有フォルダへアクセスできます。
■ Ubuntu10.04LTS 開発環境
Ubuntu10.04LTSのDVDをこちらからダウンロードしてください。
Ubuntuをインストールした後、いくつの追加パッケージをインストールすることが必要です。# apt-get install -y x11*
■ ARM用のクロス・コンパイル・ツールをインストールする。
環境変数を設定する
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin ← この行を添加する
動作の確認:
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /opt/FriendlyARM/mini2440/build-toolschain/working/src/gcc-4.4.3/configure --build=i386-build_redhat-linux-gnu --host=i386-build_redhat-linux-gnu --target=arm-none-linux-gnueabi --prefix=/opt/FriendlyARM/toolschain/4.4.3 --with-sysroot=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi//sys-root --enable-languages=c,c++ --disable-multilib --with-arch=armv4t --with-cpu=arm920t --with-tune=arm920t --with-float=soft --with-pkgversion=ctng-1.6.1 --disable-sjlj-exceptions --enable-__cxa_atexit --with-gmp=/opt/FriendlyARM/toolschain/4.4.3 --with-mpfr=/opt/FriendlyARM/toolschain/4.4.3 --with-ppl=/opt/FriendlyARM/toolschain/4.4.3 --with-cloog=/opt/FriendlyARM/toolschain/4.4.3 --with-mpc=/opt/FriendlyARM/toolschain/4.4.3 --with-local-prefix=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi//sys-root --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-c99 --enable-long-long --enable-target-optspace
Thread model: posix
gcc version 4.4.3 (ctng-1.6.1)
■ x86用のqtopia-2.2.0をコンパイルと実行する
コンパイルの手順:# cd /opt
# mv qtopia-2.2.0-nissin qtopia-2.2.0-x86
# cd qtopia-2.2.0-x86
# ./make-x86.sh
make-x86.shの内容:
#!/bin/bash
echo yes | ./configure -qte '-embedded -no-xft -qconfig qpe -depths 16,32 -system-jpeg -gif' -qpe '-edition pda -displaysize 240x320 -fontfamilies "helvetica fixed micro smallsmooth smoothtimes"' -qt2 '-no-opengl -no-xft' -dqt '-no-xft -thread'
make
make install
tar xfvz fonts.tar.gz -C qtopia/image
コンパイル成功すると、次のコマンドでシミュレート実行する。
← シミュレート実行する様子
run-x86の内容:
#!/bin/bash ./qt2/bin/qvfb -width 240 -height 320 -depth 16 & cd qtopia/image mkdir root 2 > /dev/null || true export HOME=$PWD/root cd opt/Qtopia export PATH=$PWD/bin:$PATH export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBARAY_PATH export QTDIR=$PWD export QPEDIR=$PWD export KDEDIR=$PWD/../kde sleep 3 qpe
■ ARM用のqtopia-2.2.0をコンパイルと実行する
コンパイルの手順:# cd /opt
# mv qtopia-2.2.0-nissin qtopia-2.2.0-arm
# cd qtopia-2.2.0-arm
# ./make-arm.sh
make-arm.shの内容:
#!/bin/bash
← タッチパネルのライブラリ-tslibとARM用のコンパイルツールlinux-arm-g++を指定する
echo yes | ./configure -qte '-embedded -no-xft -qconfig qpe -depths 16,32 -system-jpeg -qt-zlib -qt-libpng -gif -no-g++-exceptions -no-qvfb -xplatform linux-arm-g++ -tslib' -qpe 'edition pda -displaysize 240x320 -fontfamilies "helvetica fixed micro smallsmooth smoothtimes unifont" -xplatform linux-arm-g++ -luuid' -qt2 '-no-opengl -no-xft' -dqt '-no-xft -thread'
make
make install
tar xfvz fonts.tar.gz -C qtopia/image
コンパイル成功した後、ARM用のqtopia-2.2.0をディレクトリ/opt/qtopia-2.2.0-arm/qtopia/image/optに生成されました。ボードの同名ディレクトリ/optを取り替える。ボードを再起動して、新qtopiaが動くはずです。
qtopiaの起動スクリプトはボードの/bin/qtopiaファイルをご参照ください。
#!/bin/sh export TSLIB_TSDEVICE=/dev/input/event0 ← タッチパネルのデバイス名 export TSLIB_CONFFILE=/usr/local/etc/ts.conf export TSLIB_PLUGINDIR=/usr/local/lib/ts export TSLIB_CALIBFILE=/etc/pointercal export QTDIR=/opt/Qtopia ← 環境変数 export QPEDIR=/opt/Qtopia export PATH=$QTDIR/bin:$PATH export LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH TS_INFO_FILE=/sys/devices/virtual/input/input0/uevent if [ -e $TS_INFO_FILE -a "/bin/grep -q TouchScreen < $TS_INFO_FILE" ]; then export QWS_MOUSE_PROTO="TPanel:/dev/input/event0 USB:/dev/input/mice" if [ -e /etc/pointercal -a ! -s /etc/pointercal ] ; then rm /etc/pointercal fi else export QWS_MOUSE_PROTO="USB:/dev/input/mice" ← マウス </etc/pointercal fi unset TS_INFO_FILE export QWS_KEYBOARD=TTY:/dev/tty1 ← キーボード export KDEDIR=/opt/kde export HOME=/root exec $QPEDIR/bin/qpe 1 > /dev/null 2 > /dev/null ← qtopiaを起動させる
■ 初のqtopiaサンプル(簡易電卓)
画面のような簡易電卓を作ります。ソースはこちらです。以下はソースを作った手順を簡単に説明します。
Qt/Qtopiaにはdesignerというツールがあります。次のコマンドで簡易電卓のGUIをデザインする。

「Widget」を選択して、「OK」ボタンを押します。

設計した電卓の外観:
3個Line Edit: 2個(m_x, m_y)は数値の入力用、1個(m_result)は結果の出力用。
2個Button: 1個は「=」、押すと結果を出る。1個は「Close」、プログラムを閉じる。
1個Label: 「+」を表示する。
GUIを設計した後、GUIの動作を定義する。まず、Slot関数を添加する。メニュー「Edit」->「Slot」を選択する

「New Slot」ボタンでcalcButtonClicked()とcloseButtonClicked()関数を添加する。
次の操作でボタンのイベントをSlot関数にリンクする。

左上の

ボタンのSignalsからclicked()を選択し、SlotsからcalcButtonClicked()を選択し、「Connect」ボタンでリンクする。同じ方法で「Close」ボタンのSignal/Slotをリンクする。
これまで、GUIの設計完了しました。ソースコードを編集する。
まず、プログラムの入口main.cppを編集する。
#include "main_form.h"
#include <qtopia/qpeapplication.h>
QTOPIA_ADD_APPLICATION("mycalc”,TMainForm)
QTOPIA_MAIN
#if !defined (__MAIN_FORM_H__)
# define __MAIN_FORM_H__
#include "main_form_base.h"
#include <qsocketnotifier.h>
class TMainForm: public TMainFormBase {
Q_OBJECT
public:
TMainForm(QWidget * parent = 0, const char * name = 0, WFlags f = WType_TopLevel)
: TMainFormBase(parent,name,f) {}
virtual ~TMainForm() {}
public slots:
void calcButtonClicked();
void closeButtonClicked();
};
#endif
main_form.cppにはSlot関数があります。
#include "main_form.h" #includevoid TMainForm::calcButtonClicked() { m_result->setText( "" ); if (m_x->text().isEmpty() || m_y->text().isEmpty()) { return ; } bool ok = false; int x = m_x->text().toInt(&ok); if (!ok) { m_x->setText(""); return ; } ok = false; int y = m_y->text().toInt(&ok); if (!ok) { m_y->setText(""); return ; } m_result->setText( QString::number( x + y ) ); } void TMainForm::closeButtonClicked() { close(); }
プロジェクトファイルを編集する
CONFIG += qtopiaapp CONFIG -= buildQuicklaunch HEADERS = main_form.h SOURCES = main_form.cpp main.cpp INTERFACES = main_form_base.ui TARGET = mycalc
次のスクリプトでx86版実行ファイルをコンパイルする
buildhost.shの内容:
#!/bin/bash source /opt/qtopia-2.2.0-x86/setQpeEnv qmake -o Makefile.host -spec qws/linux-generic-g++ *.pro make -f Makefile.host clean make -f Makefile.host
実行ファイルを生成した後、シミュレータで実行してみます。まず、qtopiaを実行させます。
# ./run-x86 &
簡易電卓の実行用の環境変数の設定ファイルを編集する
#!/bin/bash export QTDIR=/opt/qtopia-2.2.0-x86/qtopia/image/opt/Qtopia/ export QPEDIR=/opt/qtopia-2.2.0-x86/qtopia/image/opt/Qtopia/ export HOME=$QPEDIR/root/ export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBARAY_PATH
簡易電卓を実行させます。
# . ./setEnv.sh ← 二つの「.」の間、スペースが必要です。
← 意味は実行した後、環境変数の設定も有効です。
# ./mycalc ← 簡易電卓を実行させる
次のスクリプトでARM版実行ファイルをコンパイルする
buildarm.shの内容:
#!/bin/bash source /opt/qtopia-2.2.0-arm/setQpeEnv qmake -o Makefile.target -spec qws/linux-generic-g++ *.pro make -f Makefile.target clean make -f Makefile.target
完了すると、簡易電卓の実行ファイルmycalcを生成されました。ボードで実行すれば、desktopファイルとアイコンファイルを用意する。 desktopファイルを編集する
[Translation] File=QtopiaSettings Context=mycalc Comment[Desktop Entry/Name]=Use soft hyphen (char U00AD) to indicate hyphenation [Desktop Entry] Exec=mycalc Icon=mycalc Type=Application Name[]=My Calculator CanFastload=0
ある48X48のpngファイルを用意して、簡易電卓のアイコンとして使います。
生成されたファイルをボードの適当ディレクトリにコピーする
[root@kaneBeBeIII]# cp mycalc.desktop /opt/Qtopia/apps/Applications/
[root@kaneBeBeIII]# cp mycalc.png /opt/Qtopia/pics/
起動のとき、自動的に簡易電卓を実行させる。
[root@kaneBeBeIII]# vi /bin/auto_run_mycalc ← 簡易電卓の起動スクリプトを編集する
exec $QPEDIR/bin/mycalc -qws ← この行を添加する
[root@kaneBeBeIII]# vi /etc/init.d/rcS ← システムの起動スクリプトも編集する
/bin/auto_run_mycalc & ← この行を添加する
単独実行させる様子:
■ ARM用のQt-4.6.3をコンパイルと実行する
コンパイルの手順:# cd /opt/arm-qte-4.6.3
# echo yes | ./configure -opensource -embedded arm -xplatform qws/linux-arm-g++ -no-webkit -qt-libtiff -qt-libmng -qt-mouse-tslib -qt-mouse-pc -no-mouse-linuxtp
←configureのパラメータの簡単な説明 -embedded arm: armのembedded版; -xplatform qws/linux-arm-g++: arm-linuxクロスコンパイラを指定する; -qt-mouse-tslib: tslibでタッチパネルを使う;# make && make install
# ./mktarget ← 生成されたファイルをパッケージにする。
最後、target-qte-4.6.3.tgzというパッケージが生成されました。このファイルをボードにコピーして、次のコマンドで解凍する。
※ Qt-4.6.3は既にボードの/usr/local/Trolltechに実装されました。以上の手順が省略すれば大丈夫です。
ボードでQt4のサンプルを実行させます。実行用のスクリプトを編集する。
#!/bin/sh export TSLIB_TSDEVICE=/dev/input/event0 export TSLIB_CONFFILE=/usr/local/etc/ts.conf export TSLIB_PLUGINDIR=/usr/local/lib/ts export TSLIB_CALIBFILE=/etc/pointercal export LD_LIBRARY_PATH=/usr/local/lib export PATH=/bin:/sbin:/usr/bin/:/usr/sbin:/usr/local/bin export QWS_DISPLAY=:1 TS_INFO_FILE=/sys/devices/virtual/input/input0/uevent if [ -e $TS_INFO_FILE -a "/bin/grep -q TouchScreen < $TS_INFO_FILE" ]; then export QWS_MOUSE_PROTO="Tslib:/dev/input/event0 MouseMan:/dev/input/mice" if [ ! -s /etc/pointercal ] ; then rm /etc/pointercal /usr/local/bin/ts_calibrate fi else export QWS_MOUSE_PROTO="MouseMan:/dev/input/mice" fi unset TS_INFO_FILE export QWS_KEYBOARD=TTY:/dev/tty1 export HOME=/root cd /usr/local/Trolltech/QtEmbedded-4.6.3-arm/demos/embedded/fluidlauncher ./fluidlauncher -qws hotplug
起動のとき、自動的Qt4サンプルを実行させる。
/bin/qt4 & ← この行を添加する
再起動後、qt4サンプルが動く様子:
■ Qt4版の簡易電卓
Qt4ライブラリでqtopia-2.2.0版と同じの簡易電卓を作ります。Qt4版の簡易電卓のソースはこちらです。まず、開発ツールQt Creatorをインストールする。
http://qt.nokia.com/downloadsの「Go LGPL」に入ります、最新版のQt SDK for Linux/X11 32-bit** (422 MB)をダウンロードする。現時点の最新版はqt-sdk-linux-x86-opensource-2010.05.1.binです。
次のコマンドでQt CreatorをFedora9にインストールする
# ./qt-sdk-linux-x86-opensource-2010.05.1.bin
次のコマンドでQt Creatorを起動させます。

左側の「Qt C++ Project」、右側の「Qt Gui Application」を選択し、「Choose…」ボタンを押します。

プロジェクト名と適当なディレクトリを入力して、「Next」を押します。

QtEmbeded4.6.3を選択して、「Next」を押します。

QWidgetを選択して、「Next」を押します。

「Finish」を押します。

この画面で簡易電卓のGUIを設計します。

GUIを設計完了した様子
現在、GUIの動作プログラムを書きましょう。

「=」ボタンをマウス右クリックして、メニュー「Go to slot」を選択する

Clicked()を選択して、「OK」を押します。

clicked信号の処理関数on_pushButton_clicked()のコードを入力する。
void Widget::on_pushButton_clicked()
{
ui->m_result->setText( "" );
if (ui->m_x->text().isEmpty() || ui->m_y->text().isEmpty()) {
return ;
}
bool ok = false;
int x = ui->m_x->text().toInt(&ok);
if (!ok) {
ui->m_x->setText("");
return ;
}
ok = false;
int y = ui->m_y->text().toInt(&ok);
if (!ok) {
ui->m_y->setText("");
return ;
}
ui->m_result->setText( QString::number( x + y ) );
}void Widget::on_pushButton_2_clicked()
{
close();
}
左下の緑矢印でホスト環境でコンパイルとシミュレータで実行する。
現在、ARM版の簡易電卓をコンパイルする。
メニュー「Tools」->「Options」で下の画面を開く

左のQt4を選択し、左の「+」ボタンでQtEmbeded4.6.3を添加する。「OK」ボタンを押す。

① 左側のProjectsを選択する。
②「Qt inPATH Release」に設定する。
③「QtEmbeded4.6.3」に設定する。
④ Build directoryに適当なディレクトリを設定する。
⑤⑥「Qt in PATH Release」に設定するかどうか、確認する
⑦ クロスコンパイルを開始いたします。
コンパイル完成すれば、Build directoryにはARM実行ファイルHelloQt4を生成されました。HelloQt4をボードの/binにコピーする。起動用のスクリプトを編集する。
[root@kaneBeBeIII]# vi /bin/mycalcQt4
[root@kaneBeBeIII]# vi /etc/init.d/rcS ← システムの起動スクリプトも編集する./fluidlauncher -qws← この行を削除する /bin/HelloQt4 -qws ← この行を添加する
/bin/mycalcQt4 & ← この行を添加する
再起動後、Qt4版簡易電卓が動く様子:
■ 簡易シリアル・ターミナル
シリアルポート通信の基本原理:
まず、シリアルポートを開く。次のようなコードint openSerialPort()
{
int fd = -1;
const char *devName = "/dev/ttySAC2";
fd = ::open(devName, O_RDWR|O_NONBLOCK);
if (fd < 0) {
return -1;
}
termios serialAttr;
memset(&serialAttr, 0, sizeof serialAttr);
serialAttr.c_iflag = IGNPAR;
serialAttr.c_cflag = B115200 | HUPCL | CS8 | CREAD | CLOCAL;
serialAttr.c_cc[VMIN] = 1;
if (tcsetattr(fd, TCSANOW, &serialAttr) != 0) {
return -1;
}
return fd;
}Linuxの標準I/O関数read/writeでシリアルポートをアクセスすれば、受送信できます。しかし、いつかシリアルポートから受信できるか、分かりません。Qtはある簡単な方法でこの問題を解決する。次のコード:
m_fd = openSerialPort();
if (m_fd < 0) {
QMessageBox::warning(this, tr("Error"), tr("Fail to open serial port!"));
return ;
}
m_notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
connect (m_notifier, SIGNAL(activated(int)), this, SLOT(remoteDataIncoming()));void TMainForm::remoteDataIncoming()
{
char c;
if (read(m_fd, &c, sizeof c) != 1) {
QMessageBox::warning(this, tr("Error"), tr("Receive error!"));
return;
}
m_receiveEdit->insert(QString(QChar(c)));
}ほかの設計と実行は簡易電卓とほぼ同じです。こちらは設計された簡易シリアル・ターミナルのソースです。
■ PWM, Buttons, LEDs, ADCなどのサンプル
PWM, Buttons, LEDs, ADCなどのサンプルはこちらです。作り方は簡易電卓とほぼ同じです。ご参照ください。■ 自分のプログラム・グループを作る
[root@kaneBeBeIII]# cd /opt/Qtopia/apps/MyApps
[root@kaneBeBeIII]# vi .directory ← 編集する
[Translation] ← .directoryの内容 File=QtopiaApps Context=MyApps [Desktop Entry] Name[]=MyApps ← グループの表示名、UTF8、日本語にも対応 Icon=MyApps ← グループの表示アイコン、pngファイル← サンプルのdesktopファイルをMyAppsにコピーする
[root@kaneBeBeIII]# cp mycalc.desktop /opt/Qtopia/apps/MyApps
[root@kaneBeBeIII]# cp MyApps.png /opt/Qtopia/pics ← 用意したアイコンファイルをコピーする
再起動後、新グループが見えます。
