はじめてのQtopiaアプリケーション開発

C言語で標準ライブラリを使ったプログラミング程度しか出来ない自分のために、Qtopia上で動くGUIアプリケーションを作るための手順を少しずつ時々書き記していこうと思う。

はじめに

ザウルスのQtopiaアプリケーションはQt/Embedded(以下、Qt/Eと省略)ってライブラリ上で動いている。ウィンドウの出し方などのQt APIはQtと共通なので、Web上にあるQtリファレンスの日本語訳がそのままマニュアルとして使える。
ちなみにSL-A300からSL-C3200にいたるまで/opt/QtPalmtop/libにlibqte.so.2.3.2があることから、Qt/E 2.3.2を採用していると思われるので、リファレンスもQt 2.3.2のを参照すればいい。(同様にlibqpe.so.1.5.0があることから、Qtopia 1.5.0を採用していると思われる)
http://www.kde.gr.jp/~ichi/qtdoc-ja.html

サンプルプログラムについて

一般的にはQtDesignerでウィンドウを作って、そこにテキストボックスやメニューを載せてくと、ヘッダファイル(*.h)と、これに対応するプログラムファイル(*.cpp)が出来るので、*.cpp にウィンドウ内で処理したいプログラムを書き加えていくらしい。
そうして出来たいくつかのウィンドウから最初に表示するメインウィンドウを呼び出すプログラムファイル(大抵は main.cpp)を加えて、アプリケーションが出来上がるらしいので、これを想定してサンプルプログラムもウィンドウ(画面デザイン)、ウィンドウ内で動くプログラム、ウィンドウを呼び出すプログラムの順番に作るといった手順で解説してみた。

ウィンドウの表示

GUIプログラミングなので、まずはウィンドウを表示しなければ始まらない。ウィンドウの画面デザインはヘッダファイルとして作成するものらしいので、まずは何も無いウィンドウだけの画面デザインを mainwindow.h として作成する。

#include <qwidget.h>

class MainWindow : public QWidget
{
public:
    MainWindow( QWidget * parent=0, const char * name=0, WFlags f=0 );
};

何も無いウィンドウはQWidgetに相当するらしい。
http://www.kde.gr.jp/~ichi/qt-2.3.2/qwidget.html
QWidgetのページはまだ翻訳されていないので判りづらいけど、最初に #include が必要らしいので書いておく。(1行目)
ウィンドウはMainWindowって名前で、QWidgetを使って作成する。(3行目)
この後、QWidgetの機能から必要なものを書いていく。今回は最低限必要となるウィンドウの作成(初期化)を定義している。これはQWidgetの機能(Public Members)として一番最初に書いてある書式をそのまま書く。ただし、最初の QWidget( で始まる部分は、今回付けた名前の MainWindow( に置き換えて書く。(6行目)
色々と判らんとこがあるけど、こーゆー書き方をするもんらしいので、今はそう理解しておくことにする。

ウィンドウ上で動くプログラムを書く

ウィンドウ上で動くプログラムは、さっき作った画面デザインのヘッダファイルに対応するように作成するものらしいので、タイトルバーにアプリケーション名を表示するだけのプログラムを mainwindow.cpp として作成する。

#include "mainwindow.h"

MainWindow::MainWindow( QWidget * parent, const char * name, WFlags f )
    : QWidget( parent, name, f )
{
    setCaption( "MainWindow" );
};

最初にさっき作った画面デザインのヘッダファイルを読み込む。(1行目)
ウィンドウは MainWindow って名前で作ってたので、さっきと同様にQWidgetの初期化の書式を同じような感じで書く。ただし、値を設定する部分は省略する。(例:const char * name=0 → const char * name)(3行目)
続いて同様の書式を今度は変数の型の定義を省略して書く。(例:const char * name → name)(4行目)
あとは { と }; で囲った中にプログラムを書く。このプログラムはQWidgetの初期化(ウィンドウが作成される時)に実行される。(5〜7行目)
今回はQWidgetの機能としてあるタイトルバーにアプリケーション名などを表示するために使うsetCaptionで、アプリケーション名として MainWindow を表示している。

Qtopiaアプリケーションとして動かせるようにする

これまで作った画面デザインのヘッダファイルや、これに対応するプログラムをQtopiaアプリケーションとして動かすために、メインとなるウィンドウを呼び出すメインプログラム main.cpp を作成する。

#include <qpe/qpeapplication.h>
#include "mainwindow.h"

int main( int argc, char **argv )
{
    QPEApplication a( argc, argv );
    MainWindow w;
    a.showMainWidget( &w );
    return a.exec();
}

Qtopiaアプリケーションとして動かすためにはQPEApplicationを使うので、これを使うために必要なqpeapplication.hと、これまでに作成した画面デザインのヘッダファイルを読み込んでおく。(1、2行目)
aって名前のQtopiaアプリケーションをQPEApplicationで作成する。(6行目)
画面デザインで作ったウィンドウ MainWindow を w って名前で定義(7行目)して、これをQtopiaアプリケーション a のメインウィンドウとして定義する。(8行目)
Qtopiaアプリケーション a を開始する。(9行目)

コンパイルと実行

dev-img.bin パッケージ化群をインストールしたザウルスに、ここまで作った画面デザインの mainwindow.h、ウィンドウ上で動くプログラム mainwindow.cpp、メインウィンドウを呼び出すプログラム main.cpp を適当なディレクトリに入れておく。(関係ないファイルをディレクトリに入れてはいけない)
http://www.areanine.gr.jp/~nyano/download.html#devimg

progen -o mainwindow.pro

これで今いるディレクトリ内のファイル全て元にプロジェクトファイル mainwindow.pro を作ってくれる。

tmake -o Makefile mainwindow.pro

これでプロジェクトファイルから Makefile を作ってくれる。

make

これで Makefile を元にプログラムをコンパイルしてくれる。出来上がったプログラムはプロジェクトファイルから .pro を除いた名前になっている。

./mainwindow

これで作成したプログラムを実行できる。単純に何も無いウィンドウだけが最大画面で表示され、タイトルバーにアプリケーション名として「MainWindow」と表示されているはず。Cancelキーを押せば終了させられる。
単純なプログラムではあるけれど、これに色々とメニューを付けたり、テキストボックスを載せたりすることも出来るので、個人的にはC言語で最初に作るHello Worldのようなサンプルになっていると思う。