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 開発環境

ARM環境のQt開発は初心者にFedora9.0をお勧めします。ほかのLinuxもできますが、いくつの追加パッケージをインストールすることが必要です。

Fedora9のDVDをこちらからダウンロードしてください。

仮想マシンVMware Player環境にFedora9をインストールすれば、次の設定:

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 g++
# apt-get install -y x11*

■ ARM用のクロス・コンパイル・ツールをインストールする。

# tar zxvf arm-linux-gcc-4.4.3.tar.gz -C /

環境変数を設定する
# gedit ~/.bashrc

export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin ← この行を添加する
環境変数を設定した後、ターミナルを再起動して、環境変数を有効化する。

動作の確認:
# arm-linux-gcc -v
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をコンパイルと実行する

コンパイルの手順:
# tar zxvf qtopia-2.2.0-nissin-20110426.tgz -C /opt
# 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の内容:
# gedit 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
← シミュレート実行する様子

run-x86の内容:
# gedit 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をコンパイルと実行する

コンパイルの手順:
# tar zxvf qtopia-2.2.0-nissin-20110426.tgz -C /opt
# cd /opt
# mv qtopia-2.2.0-nissin qtopia-2.2.0-arm
# cd qtopia-2.2.0-arm
# ./make-arm.sh
※ ARMとx86用のqtopiaのソースコードは同じです。コンパイルのスクリプトだけ異なります。

make-arm.shの内容:
# gedit 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ファイルをご参照ください。
[root@kaneBeBeIII]# vi /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をデザインする。
# /opt/qtopia-2.2.0-arm/qt2/bin/designer main_form_base.ui

「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を編集する。
# gedit main.cpp
#include "main_form.h"
#include <qtopia/qpeapplication.h>
QTOPIA_ADD_APPLICATION("mycalc”,TMainForm)
QTOPIA_MAIN
main.cppは簡単です。すべて4行コードです。main.cppが使っているファイルmain_form.hとクラスTMainFormはまだありません。次のステップで作ります。

# gedit main_form.h
#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.hはmain_form_base.hというファイルをインクルードする。main_form_base.hファイルは作ったGUIファイルmain_form_base.uiから自動的に生成されます。クラスTMainFormBaseもmain_form_base.uiから自動的に生成されます。

main_form.cppにはSlot関数があります。
# gedit main_form.cpp
#include "main_form.h"
#include 

void 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();
}

プロジェクトファイルを編集する
gedit mycalc.pro
CONFIG		+= qtopiaapp
CONFIG		-= buildQuicklaunch
HEADERS		= main_form.h
SOURCES		= main_form.cpp main.cpp
INTERFACES      = main_form_base.ui
TARGET		= mycalc

次のスクリプトでx86版実行ファイルをコンパイルする
# ./buildhost.sh

buildhost.shの内容:
# gedit 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を実行させます。
# cd /opt/qtopia-2.2.0-x86
# ./run-x86 &

簡易電卓の実行用の環境変数の設定ファイルを編集する
# gedit setEnv.sh
#!/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

簡易電卓を実行させます。
# chmod +x setEnv.sh ← 実行権限に設定する
# . ./setEnv.sh ← 二つの「.」の間、スペースが必要です。
← 意味は実行した後、環境変数の設定も有効です。

# ./mycalc ← 簡易電卓を実行させる

次のスクリプトでARM版実行ファイルをコンパイルする
# ./buildarm.sh

buildarm.shの内容:
# gedit 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ファイルを編集する
# gedit mycalc.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 /opt/Qtopia/bin/
[root@kaneBeBeIII]# cp mycalc.desktop /opt/Qtopia/apps/Applications/
[root@kaneBeBeIII]# cp mycalc.png /opt/Qtopia/pics/
ボードを再起動すれば、簡易電卓のアイコンが見えます。このアイコンをクリックして、簡易電卓を実行してみます。

起動のとき、自動的に簡易電卓を実行させる。
[root@kaneBeBeIII]# cp /bin/qtopia /bin/auto_run_mycalc ← qtopiaの起動スクリプトをコピーする
[root@kaneBeBeIII]# vi /bin/auto_run_mycalc ← 簡易電卓の起動スクリプトを編集する

exec $QPEDIR/bin/qpe 1 > /dev/null 2 > /dev/null ← 最後の行を削除する
exec $QPEDIR/bin/mycalc -qws ← この行を添加する

[root@kaneBeBeIII]# vi /etc/init.d/rcS ← システムの起動スクリプトも編集する

/bin/qtopia & ← この行を削除する
/bin/auto_run_mycalc & ← この行を添加する

単独実行させる様子:


■ ARM用のQt-4.6.3をコンパイルと実行する

コンパイルの手順:
# tar zxvf arm-qte-4.6.3-20100802.tar.gz -C /opt
# 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というパッケージが生成されました。このファイルをボードにコピーして、次のコマンドで解凍する。
[root@kaneBeBeIII]# tar zxvf target-qte-4.6.3.tgz -C /

※ Qt-4.6.3は既にボードの/usr/local/Trolltechに実装されました。以上の手順が省略すれば大丈夫です。

ボードでQt4のサンプルを実行させます。実行用のスクリプトを編集する。
[root@kaneBeBeIII]# vi /bin/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

[root@kaneBeBeIII]# chmod +x /bin/qt4 ← 実行権限に設定する
※ スクリプト/bin/qt4も既に揃っています。

起動のとき、自動的Qt4サンプルを実行させる。
[root@kaneBeBeIII]# vi /etc/init.d/rcS ← システムの起動スクリプトも編集する

/bin/qtopia & ← この行を削除する
/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にインストールする
# chmod +x qt-sdk-linux-x86-opensource-2010.05.1.bin ← 実行権限に設定する
# ./qt-sdk-linux-x86-opensource-2010.05.1.bin
基本的に画面の「Next」ボタンを押して、インストール完成する。

次のコマンドでQt Creatorを起動させます。
# /opt/qtsdk-2010.05/bin/qtcreator
「Create Project」を押します。


左側の「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 ) );
}
同じ方法で「close」ボタンのコードを入力する。
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]# cp /bin/qt4 /bin/mycalcQt4
[root@kaneBeBeIII]# vi /bin/mycalcQt4
./fluidlauncher -qws ← この行を削除する
/bin/HelloQt4 -qws ← この行を添加する
[root@kaneBeBeIII]# vi /etc/init.d/rcS ← システムの起動スクリプトも編集する

/bin/qtopia & ← この行を削除する
/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;
}
このコードは標準的なC/C++です。Qtとの関係がありません。/dev/ttySAC2はシリアルポートのデバイス名。/dev/ttySAC0はコンソールで使われています。/dev/ttySAC1と/dev/ttySAC2はユーザが自由的に使える。USBシリアルポートを使う場合は、/dev/ttyUSBxです。

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()));
QSocketNotifierはQtのクラスです。シリアルポートを監視して、受信があれば、自動的に受信関数remoteDataIncoming()をコールする。下は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]# mkdir -p /opt/Qtopia/apps/MyApps ← グループのディレクトリを作る
[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 ← 用意したアイコンファイルをコピーする

再起動後、新グループが見えます。