第1章 Hello Qt!

1.1 Hello Qt!

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
  #include <QApplication>
  #include <QLabel>

  int main(int argc, char** argv)
  {
    QApplication app(argc, argv);
    QLabel* label = new QLabel("Hello Qt!");
    label->show();
    return app.exec();
  }

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

qmake -project

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

qmake

をタイプし、最後に

make

とします。これでフォルダに実行ファイルが作成されたはずです。

WindowsでVisualStudioを使っている場合は、コマンドプロンプトを実行し ソースコードが置いてあるフォルダに移動したあと、

qmake -project -t vcapp -o hello.pro

をタイプし、次に

qmake

を実行します。そうすると、hello.vcprojというVisualStudioのプロジェクト ファイルが作成されます。 このプロジェクトを実行し、コンパイルを行ってください。

プログラムを実行するとWindows環境の場合、図 Windowsで実行したHello のように表示されると思います。

../../_images/exe01.png

Windowsで実行したHello

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

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

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

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

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

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

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

1.2 ラベルについて(QLabel)

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

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

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

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

Windowsで実行したHello2 のように、斜体文字となりました。

../../_images/exe02.png

Windowsで実行したHello2

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

QLabel* label = new QLabel("<h2><i>Hello<br>Qt!</i></h2>");

とすると、図 Linuxで実行したTest2 となります。

../../_images/exe03b.png

Linuxで実行したTest2

HTMLについてはここでは説明しません。興味のある方はインターネットで調べてみてください。 とほほのWWW入門(http://www.tohoho-web.com/www.htm)なんかがお勧めです。

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
  #include <QApplication>
  #include <QPushButton>

  int main(int argc, char** argv)
  {
    QApplication app(argc, argv);
    QPushButton* button = new QPushButton("Hello Qt!");
    button->resize(200,50);
    button->move(100,50);
    button->show();
    return app.exec();
  }
../../_images/exe04.png

QPushButtonの例(on Windows)

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

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

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

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

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

さて、このプログラムの実行結果は図 QPushButtonの例(on Windows) となります。

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

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を与えてあげればよいです。

図:ref:chap01exe05

button->setFont( QFont("Times", 15, QFont::Bold , true) );

を追加 した場合の実行例です。

../../_images/exe05.png

QFontの例(on Windows)

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
  #include <QApplication>
  #include <QLabel>

  int main(int argc, char** argv)
  {
    QApplication app(argc, argv);
    QLabel* label = new QLabel("こんにちは Qt");
    label->show();
    return app.exec();
  }

この実行結果は図 日本語の表示(on Linux) となります。

../../_images/exe06.png

日本語の表示(on Linux)

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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
  #include <QApplication>
  #include <QLabel>
  #include <QTextCodec>
  #include <QString>

  int main(int argc, char** argv)
  {
    QApplication app(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
    QLabel* label = new QLabel(QObject::tr("こんにちは Qt"));
    label->show();
    return app.exec();
  }

実行結果は、下図のとおりとなります。

image8 image9
(a)on Linux (b)on Windows

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

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

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

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

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

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

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

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

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

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

[1]WindowとGadgetを混ぜた言葉で、日本語に直すとウィンドウの部品ということです。 QPushButtonやQLabelなどが部品に当たります。