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

てな訳で、こないだの続き。
http://d.hatena.ne.jp/nyanonon/20060526#p1
今日はボタン押した時に何等かの動きをさせてみる。

ボタンを押した時にアプリケーションを終了させる

ボタンを押した時は、QPushButton に clicked() として、アプリケーションを終了させるのは qApp の quit() として用意されているので、この動作を connect で繋ぐだけで出来る。qApp ってのは現在動作中のアプリケーションを指していて、QApplication(QPEApplication かな?)で定義されているらしい。
ちなみに高速起動させたいアプリケーションでは qApp の quit() を使っちゃダメとか、色々あるらしい。
http://digit.que.ne.jp/visit/index.cgi?UnofficialSharpZaurusSL-5500FAQ%2FProgramming#i15

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 );

    connect( PushButton1, SIGNAL( clicked() ), qApp, SLOT( quit() ) );
}

ボタンを押した時にテキストボックスを空にする

テキストボックスを空にするのは、QMultiLineEdit に clear() として用意されているので、さっきと同じように connect で始まる行を下記のように追加する。

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 );

    connect( PushButton1, SIGNAL( clicked() ), qApp, SLOT( quit() ) );
    connect( PushButton2, SIGNAL( clicked() ), MultiLineEdit1, SLOT( clear() ) );
}

ボタンを押した時にテキストボックスに文字を表示する

テキストボックスに任意の文字を表示するための仕組み(SLOT)は QMultiLineEdit に用意されてないので、自分で作る。
自分で作る場合は、Q_OBJECT ってのを最初に書いておく必要がある。(C++ の文法に無い書き方をするので、この Q_OBJECT マクロを展開するのに moc が必要になる。通常は tmake で作った Makefile が勝手に処理してくれるので気にする必要は無い。)

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

class Form1 : public QWidget
{
    Q_OBJECT

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

    QMultiLineEdit* MultiLineEdit1;
    QPushButton* PushButton1;

protected:
    QVBoxLayout* Form1Layout;
    QHBoxLayout* Layout1;

public slots:
    void new_slot();
};
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 );

    connect( PushButton1, SIGNAL( clicked() ), qApp, SLOT( quit() ) );
    connect( PushButton2, SIGNAL( clicked() ), this, SLOT( new_slot() ) );
}

void Form1::new_slot()
{
    MultiLineEdit1->setText( "Hello World" );
}