第1章 Hello Qt!

1.1 Hello Qt!


最初は画面にHelloQt!と表示するプログラムを作るこ とにします。まずは何も考えず次のソースコードを入力し、実行できるかどうかのテストをしてみてください。

1 #include <QApplication>  
2 #include <QLabel>  
3  
4 int main(int argc, char** argv)  
5 {  
6         QApplication app(argc, argv);  
7         QLabel* label = new QLabel("Hello Qt!");  
8         label->show();  
9         return app.exec();  
10 }

コンパイルを行うにはLinuxの場合ターミナルを実行しソースコードが置いてあるフォルダまで移動してください。その後、

qmake -project

 をタイプしてください。次に

qmake

 をタイプし、最後に

make

 とします。これでフォルダに実行ファイルが作成され たはずです。 WindowsでVisualStudioを使っている場合は、コマンドプロンプトを実行しソースコードが置いてあるフォルダに移動したあと、

 qmake -project -t vcapp -o hello.pro

をタイプし、次に

qmake

を実行します。そうすると、hello.vcprojという VisualStudioのプロジェクトファイルが作成されます。このプロジェクトを実行し、コンパイルを行ってください。 プログラムを実行するとWindows環境の場合、図  1.1のように表示されると思います。


PIC  1.1: Windowsで実行 したHello


では一行ずつ解説していきます。

1,2行目の部分は、 QApplicationとQLabelのクラスの定義をインクルードしています。 Qtを使っているGUIアプリケーションには必ず一つのQApplicationのオブジェクトが無ければなりません。また、すべて のQtクラスはヘッダーファイルとクラスが同じ名前に設定されています。

6行目はQApplication オブジェクトを作成しています。QApplicationはアプリケーションに関するリソースを管理するものであり、コンストラクタにはargcと argvを渡さなければなりません。このため、Qtで作成したプログラムでもコマンドライン引数を使うことが出来ます。

 7行目では HelloQt!と表示するラベルを作成しています。 そして8行目でラベルを表示しています。

そして9行目でコントロールをQt アプリケーションに渡します。コントロールを渡した先ではイベントループが起こっています。

これでプログラムは完成です。プロ グラムをコンパイルして実行してみてください。うまくコンパイルができたでしょうか?

ここで、QLabelはnewした のにdeleteしていないのでメモリリークが起こりますが、プログラムが終了すればオペレーティングシステムが勝手に処理してくれるので、細かいことは 気にしないでください。

1.2 ラベルについて (QLabel)


1.1
節 のプログラムでQLabelを使用しました。ここでQLabelの面白い使い方を見てみましょう。前節の

    QLabel*label=newQLabel("Hello Qt!");

の部分を次のコードに置き換えてコンパイル、実行してみてください。

    QLabel*label=newQLabel("<i>Hello Qt!</i>");

  1.2の ように、斜体文字となりました。


PIC 1.2: Windowsで実行したHello2


 という書き方はHTMLで主に使 用されています。このようにHTMLスタイルの書き方をQLabelではサポートしています。他にも

QLabel*label=newQLabel("Hello Qt!"); とすると、図 1.3と なります。


PIC図 1.3: Linuxで実行したTest2


HTMLについ てはここでは説明しません。興味のある方はインターネットで調べてみてください。

とほほのWWW 入門 (http://www.tohoho-web.com/www.htm) なんかがお勧めです。


1.3 ボタンを作ってみよう (QPushButton)

前節ではラベルを作ったので、今度はボタンを作ってみましょう。次のようなコードを書いたとします。


1 #include <QApplication>  
2 #include <QPushButton>  
3  
4 int main(int argc, char** argv)  
5 {  
6         QApplication app(argc, argv);  
7         QPushButton* button = new QPushButton("Hello Qt!");  
8         button->resize(200,50);  
9         button->move(100,50);  
10        button->show();  
11        return app.exec();  
12 }


PIC図 1.4: QPushButton の例 (on Windows)



このコードの2行目及び7行目は、1.1節のQLabelの部分がQPushButtonに変わっただけです。このようにすることでボタンを作成すること ができます。

8行目、9行目は今回始めて出てきた関数です。resize関数は、ボタンの大きさを変更するものです。この場合は、高さ200Pixels,幅 50Pixelsとなります。

move関数は、ウィンドウ(この場合ボタン)がデスクトップ上に表示される位置を決めるものです。関数はmove(x座標,y座標)となっており、デス クトップ画面の一番左端が(0,0)となっています。x座標はデスクトップの左から右にいくに従い値が増加し、y座標は上から下に行くに従い値が増加しま す。

これらresize,move関数は特に設定しなくても問題ありません。また、これらの関数はQPushButtonのみならず、QLabelなどの部品 でも使うことができます。

QPushButtonはQLabelとは違いHTMLのタグを使うことはできません。

さて、このプログラムの実行結果は図1.4となります。

ここでせっかくボタンを作ったのだから、例えば、ボタンをクリックしたらプログラムが終了するなど何かアクションを起こしたいと思うかもしれません。け ど、もう少し待ってください。この事については第3章で取り扱います。まずはWidget1の基本的な使い方を勉強してしまいましょう。

1.4 フォントを変えてみよう (QFont)

前節でボタン (QPushButton) を作りましたが、もしかしたら文字フォントを変えてみたいと思ったかもしれません。(そんなことは無い?)

Qt ではフォントを変えるのも簡単です。前節のプログラムに次のコードを書き加えるだけです。

#include <QFont>
 button->setFont( QFont("Times", 15, QFont::Bold) );

QFont を使う場合は、 QFont をインクルードしなければなりません。

QFont のコンストラクタは、 

 QFont(const QString & family, int pointSize = -1,  int weight = -1, bool italic = false ); 

と定義されています(他にもありますが省略します)。

まずは、setFont関数ですが、この関数にQFontクラスのオブジェクトを渡してあげることでフォントの変更ができます。

QFontのコンストラクタの第1引数の引数はフォントの名前を指定してあげます。例ではTimesというフォントを使うことにしました。他にも SystemやWindowsの場合だとTahomaなんていうフォントもあります。いろいろ試してみてください。

第2引数にはフォントの大きさを指定します。

第3引数にはフォントの幅を指定します。例ではフォントの幅をQFont::Boldとしました。これは75という数字に置き換えられます。ボールド文字 (太い文字)にしたい時にはQFont::Boldを使えばよいでしょう。他にもQFont::Normal(50に置き換えられる)やQFont:: Light(25に置き換えられる)などがあります。0〜99の値の範囲ならどんな値でもよいです。

第4引数はbool型となっており、イタリック体(斜体)にしたい場合はこの引数にtrueを与えてあげればよいです。

1.5は button->setFont(QFont("Times",15,QFont::Bold,true)); を追加した場合の実行例です。


PIC図 1.5: QFont の例 (on Windows)


1.5 とりあえず日本語を表示してみよう

もしかしたらもうお気づきの方もいるかもしれません。今までボタンやラベルのキャプションには英語しか使ってきませ んでした。なぜ日本語を使わなかったのかというと、実は日本語の扱いは厄介なものだからです。次のようなコードを実行したとしましょう。これは1.1節 のコードの7行目を変え ただけです。

1 #include <QApplication>  
2 #include <QLabel>  
3  
4 int main(int argc, char** argv)  
5 {  
6         QApplication app(argc, argv);  
7         QLabel* label =  new QLabel("こ んにちは Qt");  
8         label->show();  
9         return app.exec();  
10 }

この実行結果は図1.6と なります。


PIC図 1.6: 日本語の表示 (on Linux)


なんと文字化けしてしまっています。 Linux と Windows どちらも使ったことのある方な ら、文字コードの問題は厄介なものだと知っていると思います。

Windows の場合、使われている文字コードは大体が Shift-JIS です。 Unix 系の場合は EUC-JP や UTF-8 などでしょうか。この文字コードの違いにより文字化けが起こってしまいます。

この問題を回避するためには、Qtに自分が使っている文字コードを教えてあげる必要が あります。その方法は、次のようなコードになります。

1 #include <QApplication>  
2 #include <QLabel>  
3 #include <QTextCodec>  
4 #include <QString>  
5  
6 int main(int argc, char** argv)  
7 {  
8         QApplication app(argc, argv);  
9         QTextCodec::setCodecForTr(QTextCodec::codecForLocale());  
10        QLabel* label = new QLabel(QObject::tr("こんにちは  Qt"));  
11        label->show();  
12        return app.exec();  
13 }

実行結果は、図1.7と なります。


PIC PIC
(a)on Linux (b)on Windows

図 1.7: 日本語の表示


重要なのは、 9 行目と 10 行目です。
9 行目の

QTextCodec::setCodecForTr(QTextCodec::codecForLocale());

という部分で文字コードを指定しています。

setCodecForTr関数の引数には、QTextCodec型の値を渡します。

例では、QTextCodec::codecForLocale()を渡していますが、この関数はシステムで使われている標準的な文字コードを返します。 よって自分が使っている環境にあった文字コードを指定しているので大体の場合はこの方法で問題ないと思います。

ただ、人によっては文字コードを指定したい場合があるかもしれません。その場合、

QTextCodec::setCodecForTr (QTextCodec::codecForName(”Shift-JIS”));

とします。codecForName関数の中に直接使用したい文字コードを書き込みます。

10行目はQObject::tr関数を使用しています。この関数の中に文字を書く事により文字コードが正常に変換されます。また、tr関数は後に自分の 作ったプログラムを国際化したい場合にも使われます。

さて、とりあえず日本語は使えるようになりました。しかしながら、かなり説明が雑だと思います。このあたりの説明は後の章でもう一度詳しく説明することに なると思いますが、今はこういうものだと思ってください。

プログラムリスト

Hello Qt プログラム
1.3のプログラム
1.4のプログラム
1.5のプログラム

[1] Jasmin Blanchette & Mark Summerfield, C++ GUI Programming with Qt4.
[2] Trolltech, Qt Assistant Tutorial and Examples Qt Tutorial
[3] Trolltech, Qt Assistant All Classes