言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Qt その2 C++ で Hello world!

前回 http://d.hatena.ne.jp/propella/20110609/p1 QML を試してみたが、QML というのはかなり特殊用途向な事が分かった。Qt のサブシステムである QML は、.NET に対する SilverlightJava に対する JavaFX (どちらも使った事無いので雰囲気的に) のように独自ウィジェットでゲームみたいな物を作るのに適しているようだ。という訳で気を取り直して普通に C++ で Qt を試してみる。

Hello world!

hello

// hello.cpp
#include <QtGui>

int main(int argv, char **args)
{
  QApplication app(argv, args);
  
  (new QLabel("Hello"))->show();
  (new QLabel("world!"))->show();

  return app.exec();
}

単にテキストを表示するだけじゃつまらないので、二つのウインドウに分けて出してみた。今まで色々な GUI ツールキットを試して来たけど、C 系の言語では一番簡単じゃないかな。例のように、show() メソッドを使うとウィジェットをウインドウに入れてとりあえず表示してくれる。

Qt のコンパイル方法は多少変わっている。直接 Makefile を書く代わりに .pro ファイル という設定ファイルをから Makefile を生成する。.pro はいわば configure のような物。.pro ファイルの見本は qmake -project で作る。

$ PATH=$HOME/QtSDK/Desktop/Qt/473/gcc/bin:$PATH # PATH を通す。
$ cd hello
$ qmake -project # hello.pro の作成
$ qmake # Makefile の作成
$ make
$ open hello.app

Model-View

list

モデルとビューの分離はどの GUI ツールキットでも重要な機能だ。Qt では、リストやテーブル、ツリー表示等に共通して使われる構造をモデルと呼ぶ。

// list.cpp
#include <QtGui>

int main(int argc, char **argv)
{
  QApplication app(argc, argv);

  QSplitter widget;
  QStringList colors; // 文字列リストの作成
  colors << "Red" << "Orange" << "Yellow" << "Green" << "Blue" << "Purple";
  QStringListModel model(colors); // 文字列リストからモデルを作る。
  
  QListView list(&widget);
  QTreeView tree(&widget);
  QTableView table(&widget);
  QComboBox combo(&widget);
  
  list.setModel(&model);
  tree.setModel(&model);
  table.setModel(&model);
  combo.setModel(&model);
  
  widget.show();
  return app.exec();
}

使い方は非常に簡単で、既存のモデルのクラスから使いやすい奴を選んで setModel() で設定する。この例では一つのモデルを四種類のビューに表示しているが、一つのビューで編集した結果は残りのビューにも反映される。