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

QtDesignerが出力するソースを見ながら何とかアプリケーションの画面の作り方を覚えてきたのでメモ。

空のウィンドウを表示する

QWidget で作ることが出来る。QWidget に続けて書いている parent とかの部分は Qt リファレンスの QWidget の部分を見て、そのまま書けばいいらしい。
http://www.kde.gr.jp/~ichi/qtdoc-ja.html
ザウルスに搭載されているのは 2.3.2 なので、Qt-2.3.2 のクラスリファレンスを見ればいい。
http://developer.ezaurus.com/sl_j/sl_top.asp#Link

sample.h
#include 

class Form1 : public QWidget
{
public:
    Form1( QWidget * parent=0, const char * name=0, WFlags f=0 );
};
sample.cpp
#include "sample.h"

Form1::Form1( QWidget * parent, const char * name, WFlags f )
    : QWidget( parent, name, f )
{

}
main.cpp
#include 
#include "sample.h"

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

コンパイルと実行

コンパイルオプションの意味とか下記んとこが判りやすかった。
http://www.itmedia.co.jp/enterprise/articles/0412/18/news001.html

bash-2.05$ ls
main.cpp    sample.cpp  sample.h
bash-2.05$ export PERL_BADLANG=0
bash-2.05$ progen -o sample.pro
bash-2.05$ tmake -o Makefile sample.pro
bash-2.05$ make
g++ -c -pipe -DQT_QWS_EBX -DQT_QWS_CUSTOM -DQWS -fno-exceptions -fno-rtti
 -fsigned-char -DQT_NO_DRAGANDDROP -DQT_NO_PROPERTIES -Wall -W -O2 -DNO_DEBUG
 -l/home/QtPalmtop/include -o main.o main.cpp
gcc: -lstdc++: linker input file unused since linking not done
g++ -c -pipe -DQT_QWS_EBX -DQT_QWS_CUSTOM -DQWS -fno-exceptions -fno-rtti
 -fsigned-char -DQT_NO_DRAGANDDROP -DQT_NO_PROPERTIES -Wall -W -O2 -DNO_DEBUG
 -l/home/QtPalmtop/include -o sample.o sample.cpp
gcc: -lstdc++: linker input file unused since linking not done
g++  -o sample main.o sample.o  -L/home/QtPalmtop/lib -lqte -lqpe
bash-2.05$ ./sample
Display size = 480x640
bash-2.05$

タイトルバーに文字を表示する

sample.cpp
#include "sample.h"

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

テキストボックスを配置する

テキストボックスはQLineEditとQMultiLineEditがあり、後者は複数行の入力が出来るメモ帳相当なので、こっちを使ってみる。
http://www.kde.gr.jp/~ichi/qt-2.3.2/qmultilineedit.html

sample.h
#include 
class QMultiLineEdit;

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

    QMultiLineEdit* MultiLineEdit1;
};
sample.cpp
#include "sample.h"
#include 

Form1::Form1( QWidget* parent, const char* name, WFlags fl )
    : QWidget( parent, name, fl )
{
    setCaption( "Form1" );

    MultiLineEdit1 = new QMultiLineEdit( this );
}

画面いっぱいにテキストボックスを表示

setGeometry() や、resize()、move() などを使ってテキストボックスの位置や大きさを変更してもいいが、ザウルスは VGA モード、QVGA モードにそれぞれ横画面、縦画面があるので、シャープが言うようにレイアウトマネージャで自動的に適切な大きさになるようにしてみる。
http://developer.ezaurus.com/sl_j/faq/c700_faq_vga.htm#layout

sample.h
#include 
class QMultiLineEdit;
class QVBoxLayout;

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

    QMultiLineEdit* MultiLineEdit1;

protected:
    QVBoxLayout* Form1Layout;
};
sample.cpp
#include "sample.h"
#include 
#include 

Form1::Form1( QWidget* parent, const char* name, WFlags fl )
    : QWidget( parent, name, fl )
{
    setCaption( "Form1" );

    Form1Layout = new QVBoxLayout( this );

    MultiLineEdit1 = new QMultiLineEdit( this );
    Form1Layout->addWidget( MultiLineEdit1 );
}

テキストボックスの下にボタンを配置

sample.h
#include 
class QMultiLineEdit;
class QPushButton;
class QVBoxLayout;

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

    QMultiLineEdit* MultiLineEdit1;
    QPushButton* PushButton1;

protected:
    QVBoxLayout* Form1Layout;
};
sample.cpp
#include "sample.h"
#include 
#include 
#include 

Form1::Form1( QWidget* parent, const char* name, WFlags fl )
    : QWidget( parent, name, fl )
{
    setCaption( "Form1" );

    Form1Layout = new QVBoxLayout( this );

    MultiLineEdit1 = new QMultiLineEdit( this );
    Form1Layout->addWidget( MultiLineEdit1 );

    PushButton1 = new QPushButton( this );
    Form1Layout->addWidget( PushButton1 );
}

ボタン名を付ける

sample.cpp
#include "sample.h"
#include 
#include 
#include 

Form1::Form1( QWidget* parent, const char* name, WFlags fl )
    : QWidget( parent, name, fl )
{
    setCaption( "Form1" );

    Form1Layout = new QVBoxLayout( this );

    MultiLineEdit1 = new QMultiLineEdit( this );
    Form1Layout->addWidget( MultiLineEdit1 );

    PushButton1 = new QPushButton( this );
    PushButton1->setText( "PushButton1" )
    Form1Layout->addWidget( PushButton1 );
}

テキストボックスとボタンの間隔を空ける

setSpacingがテキストボックスやボタンなどの部品ごとの間隔で、setMarginがレイアウト枠全体の余白の大きさ。

sample.cpp
#include "sample.h"
#include 
#include 
#include 

Form1::Form1( QWidget* parent, const char* name, WFlags fl )
    : QWidget( parent, name, fl )
{
    setCaption( "Form1" );

    Form1Layout = new QVBoxLayout( this );
    Form1Layout->setSpacing( 6 );
    Form1Layout->setMargin( 11 );

    MultiLineEdit1 = new QMultiLineEdit( this );
    Form1Layout->addWidget( MultiLineEdit1 );

    PushButton1 = new QPushButton( this );
    PushButton1->setText( "PushButton1" );
    Form1Layout->addWidget( PushButton1 );
}

テキストボックスの下にボタンを2つ配置

sample.cpp
#include "sample.h"
#include 
#include 
#include 

Form1::Form1( QWidget* parent, const char* name, WFlags fl )
    : QWidget( parent, name, fl )
{
    setCaption( "Form1" );

    Form1Layout = new QVBoxLayout( this );
    Form1Layout->setSpacing( 6 );
    Form1Layout->setMargin( 11 );

    MultiLineEdit1 = new QMultiLineEdit( this );
    Form1Layout->addWidget( MultiLineEdit1 );

    PushButton1 = new QPushButton( this );
    PushButton1->setText( "PushButton1" );
    Form1Layout->addWidget( PushButton1 );

    PushButton2 = new QPushButton( this );
    PushButton2->setText( "PushButton2" );
    Form1Layout->addWidget( PushButton2 );
}

テキストボックス下のボタン2つを横に並べる

縦に並べるレイアウトマネージャ(QVBoxLayout)の上に、横に並べるレイアウトマネージャ(QHBoxLayout)を配置して、この上にボタン2つを配置する。

sample.h
#include 
class QMultiLineEdit;
class QPushButton;
class QVBoxLayout;
class QHBoxLayout;

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

    QMultiLineEdit* MultiLineEdit1;
    QPushButton* PushButton1;

protected:
    QVBoxLayout* Form1Layout;
    QHBoxLayout* Layout1;
};
sample.cpp
#include "sample.h"
#include 
#include 
#include 

Form1::Form1( QWidget* parent, const char* name, WFlags fl )
    : QWidget( parent, name, fl )
{
    setCaption( "Form1" );

    Form1Layout = new QVBoxLayout( this );
    Form1Layout->setSpacing( 6 );
    Form1Layout->setMargin( 11 );

    MultiLineEdit1 = new QMultiLineEdit( this );
    Form1Layout->addWidget( MultiLineEdit1 );

    Layout1 = new QHBoxLayout( this );
    Layout1->setSpacing( 6 );
    Layout1->setMargin( 0 );

    PushButton1 = new QPushButton( this );
    PushButton1->setText( "PushButton1" );
    Layout1->addWidget( PushButton1 );

    PushButton2 = new QPushButton( this );
    PushButton2->setText( "PushButton2" );
    Layout1->addWidget( PushButton2 );

    Form1Layout->addWidget( Layout1 );
}