マルチプラットフォームGUI開発環境 Qt


Qtって知らないでしょ?「キューティ」て呼びたいハニーな気分だけど、「キュート」って読むんですよ。開発系の友人でも知ってるのはQtって名前くらい。ほとんどの人が知らないんだよね。それがすごく残念。ノルウェーのTrolltech社っていうとこが作ってたものなんですが、2008年ごろに Nokia が買収して、「おー、これは来るかも!来るかも!」という感じですこし使ってみたりしたのです。でも、NokiaがマイクロソフトのWindows Phoneを採用して、しかも2012年にはフィンランドのDigiaって会社がNokiaからQtを買っちゃったんで、正直先行きは暗い感じ。でもQtの良さってあると思うのですよ。

と言いながらも、Qtはたしかバージョン3.2.Xくらいを使ったのが最後で、アンインストールしてしまったですよ。なので、新しく出た Qt5.0 をちゃんと試しておきましょうということです。

Qtをひと言でいいますとね

いやひと言じゃ無理だけど、Windows、Windows CE、Linux/X11、Mac でほとんどおんなじコードで GUI を作って動かせるミドルウェアみたいなものです。GUI部分が全部共通化できるので、たとえOSに依存するコードを潜り込ませたとしても、ちゃんと分離しておけばマルチプラットフォームのソフト開発が可能なのです。Trolltech のウェブサイトには、Skype、Google Earth、 Adobe Photoshop ElementsなどがQtで作られてると書いてあります。今もそうかは知りませんけどね。そもそも、Skypeってマイクロソフトが買っちゃったんだし。でも、けっこう本格的なプログラムが作れるってことは分かってもらえると思うんですよね。ライセンスもLGPLか商用ライセンスか選べるようになってる。

Windows では、専用のGUI開発環境であるQt CreatorとminGWで開発するか、Visual Studio 2010 かを選べます。主にWindows用ソフトを作るのなら断然VSのほうがいいけど、minGWで開発したほうがマルチプラットフォームを意識しやすくていいかもしれません。

なお、開発はC++です。他の言語でもできるようですが、C++でやるのが一番簡単ですよ。

今回は入りやすいVS版を

今回は、「Qt 5.0.0 for Windows 32-bit (VS 2010 406 MB)」ってやつをダウンロードしてまず使います。ダウンロードしてインストールして、Qt Creatorを動かしましょう。するとインストールしただけなのに、「サンプル」を開くといろんなコードがあるじゃないですか!

qt1

ここはオーディオ縛りのブログですけど、オーディオモノって地味なので、 GUIっぽいやつを選んでみましょう。Hollow World 的なやつがいいということで、Wigglyを試します。サンプルから、Wiggly Example をクリックして、実行の▶ボタンを押すと、マイクロソフトのコンパイラが自動的に動いて実行されます。こんな感じ。

コードをすこし覗いてみると

// ここにライセンスが書いてあるけど、説明がややこしいので元ファイルを見てね
#include
#include "dialog.h"
int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	bool smallScreen = QApplication::arguments().contains("-small-screen");

	Dialog dialog(0, smallScreen);

	if (!smallScreen)
		dialog.show();
	else
		dialog.showFullScreen();
	return app.exec();
}

QApplication クラスの app ができて、ちょっと細かいところを省略すると、dialog を表示してる。でその中がどうなってるのかというとこんな感じ。

// ここにライセンスが書いてあるけど、説明がややこしいので元ファイルを見てね
#include

#include "dialog.h"
#include "wigglywidget.h"

Dialog::Dialog(QWidget *parent, bool smallScreen)
	: QDialog(parent)
{
	WigglyWidget *wigglyWidget = new WigglyWidget;
	QLineEdit *lineEdit = new QLineEdit;

	QVBoxLayout *layout = new QVBoxLayout;
	layout->addWidget(wigglyWidget);
	layout->addWidget(lineEdit);
	setLayout(layout);

	connect(lineEdit, SIGNAL(textChanged(QString)),
		wigglyWidget, SLOT(setText(QString)));
	if (!smallScreen){
		lineEdit->setText(tr("Hello world!"));
	}
	else{
		lineEdit->setText(tr("Hello!"));
	}
	setWindowTitle(tr("Wiggly"));
	resize(360, 145);
}
//! [0]

前半は、なんとなくコントロールを初期化してレイアウトしてる VS だとデザイナーが生成するコードっぽいよね。途中に出てくるここのトコロが気になるでしょ?

connect(lineEdit, SIGNAL(textChanged(QString)),
	wigglyWidget, SLOT(setText(QString)));

これって Qt 独自のイベント処理の仕組みで、スレッドとかあんまり意識しないで、SIGNAL と SLOT っていう組み合わせでメッセージを飛ばせるのです。この例だと、lineEdit つまりテキストエディットボックスで textChanged というSIGNAL が発生したら、それを wigglyWidget っていうオブジェクトのsetText っていう関数で QString つまりテキストを渡せってこと。あいてはどうなってるかっていうと、こんな風に処理してる。

public slots:
	void setText(const QString &newText) { text = newText; }

なんか緩い感じがするけど、これだけ。wigglyWidget 本体は、アニメーション的なことをいろいろやってるけど、長くなるのでやめときましょう。でも、wigglyWidget.cpp って100行ぐらいでこのアニメーションを動かしてます。すごく簡単。

MacでもLunuxでも動くぜ

ってことで、ubuntu あたりで試すか?と思ったけどめんどくさいのでもうやめ。このコードだったら、そのまんまでも他のOSでも動いちゃうわけです。もちろん、ソースコードレベルの互換性ですから、コンパイルは必要ですけどね。

MacとWindows両方で動くアプリを書かなきゃならないなんて時には、最近だと Air するとかが多いのかな?でも Qt はたしかにライブラリはちょっと重いけど、コンパイルされたコードとして動くので、サクサク感はAirよりはあると思いますよ。

こんなキュートな開発環境 Qt に興味を持ってもらえたら嬉しいです。オーディオ系のコードも、Qt で書いてみようかしらとちょっと Qt 再燃中。

  • Qt Project
    http://qt-project.org/
    http://qt-project.org/wiki/Wiki_Home_Japanese
  • Qt(Wikipedia)
    http://ja.wikipedia.org/wiki/Qt
  • Digia
    http://www.digia.com/
  • minGW (Minimalist GNU for Windows)
    http://www.mingw.org/

You can skip to the end and leave a response. Pinging is currently not allowed.
Subscribe to RSS Feed Twitter は Ume108 だよ