konoha.qt4パッケージの使い方

皆さんこんにちは、お久しぶりです。あけましておめでとうございます。
本年もよろしくお願いします。

昨年末に開催されたQt Developer Conference Tokyo/2011にて、KonohaScriptの紹介をさせて頂きました。これを区切りとして、konoha.qt4パッケージを含むバイナリパッケージをgooglecodeにアップロードしました。
ダウンロードはこちらから
本日は、このバイナリパッケージのインストール方法と使い方を簡単にご紹介したいと思います。

konoha.qt4パッケージとは

konoha.qt4パッケージは、PythonにおけるPyQtライブラリのようなもので、Qtを利用したGUIアプリケーションをKonohaScriptで開発するためのライブラリ群です。

インストール方法

次の中から、ご自身の環境にあったものをダウンロードして下さい。全て64bit OS用です。

Linux版とMac版にはQt本体が含まれていませんので、別途インストールが必要になります。Linuxの方は、yumやaptなどのパッケージ管理システムからQtの最新版(Qt-4.8.0)をインストールして下さい。Macの方は、Qt Libraryのソースコードをダウンロードし、インストールパスをデフォルトのままにして、make installして下さい。
qt-everywhere-opensource-src-4.8.0.tar.gz
または、MacPortsやHomebrewをお使いの方は、Qt-4.8.0をインストールして、

/usr/local/Trolltech/Qt-4.8.0

のパスからQtのルートディレクトリを辿れるように、シンボリックリンクを作成していただいても大丈夫です。

使い方

konoha.qt4パッケージは、基本的にQtのC++インタフェースにあわせてAPI設計されています。Qtを使用したことのある方は、それほど抵抗なく利用できると思います。APIリファレンスは現在のところ用意しておりませんので、クラス設計等は、Qt本家のドキュメントhttp://doc.trolltech.com/4.8-snapshot/index.htmlをご参照ください。

konoha.qt4パッケージを利用したサンプルプログラムを幾つか用意しました。

テキストエディタ

QTextEditを利用して、簡単なテキストエディタを作成しました。

using konoha.qt4.*;
QApplication app = new QApplication();
QWidget widget = new QWidget();
QTextEdit textedit = new QTextEdit();
QVBoxLayout layout = new QVBoxLayout();
layout.addWidget(textedit);
widget.setLayout(layout);
widget.show();
app.exec();

上記のコードの実行結果は以下のようになります。

このように、konoha.qt4パッケージを使用すれば、クロスプラットフォームGUIアプリケーションを数行程度で開発することができます。c++のQtライブラリは、細かい属性を変更するたびに、変更箇所をコンパイルして実行しなければなりませんが、スクリプト言語を使用すれば、再コンパイルなしに即実行できますので、開発効率の点で非常に優れているといえます。

シグナル

本家のQtライブラリは、シグナルとスロットを用いてオブジェクト間の通信を行います。一方、konoha.qt4では、統一的なインタフェースで、シグナルに対するコールバック関数を登録することができます。

// c++の場合
// チェックボックスのオン・オフの切り替えに連動してラベルの表示・非表示を切り替える
QLabel *label = new QLabel("Label");
QCheckBox *checkBox = new QCheckBox;
connect(checkBox, SIGNAL(toggled(bool)), label, SLOT(setVisible(bool)));
// KonohaScriptの場合
// チェックボックスのオン・オフの切り替えに連動してラベルの表示・非表示を切り替える
QLabel label = new QLabel();
label.text = "Label";
void show(QCheckBox checkBox) {
	label.visible = label.isVisible() ? false : true;
}
QCheckBox checkBox = new QCheckBox();
// QCheckBoxのtoggledシグナルに対して、コールバック関数showを接続する
// QWidget.signalConnect(String signalName, dynamic callbackFunc);
checkBox.signalConnect("toggled", show);

以下はボタンを押した時/離した時に、それぞれコールバック関数を実行させるサンプルコードです。

using konoha.qt4.*;
void pressed(QPushButton button) {
	print "pressed";
	print b;
}
void released(QPushButton button) {
	print "released";
	print b;
}
QApplication app = new QApplication();
QPushButton button = new QPushButton();
button.signalConnect("pressed", pressed);
button.signalConnect("released", released);
button.show();
app.exec();

ボタンを2回押した時の実行結果は以下のようになります。(コンソール含む)

Webビューワ

最後に、QtWebKitを利用したサンプルとして、シンプルなWebビューワをご紹介します。

using konoha.qt4,*;

class SimpleWebViewer {
	QUrl url;
	QWebView web_view;
	QToolButton next;
	QToolButton prev;
	QLineEdit location_bar;
	QHBoxLayout hbl;
	QVBoxLayout vbl;
	QWidget body;

	SimpleWebViewer(String u) {
		url = new QUrl();
		url.setUrl(u);
		web_view = new ();
		web_view.load(url);
		next = new ();
		next.setArrowType(3);
		prev = new ();
		prev.setArrowType(4);
		location_bar = new ();
		hbl = new ();
		hbl.addWidget(next);
		hbl.addWidget(prev);
		hbl.addWidget(location_bar);
		hbl.addStretch();
		vbl = new ();
		vbl.addLayout(hbl);
		vbl.addWidget(webView);
		body = new ();
		body.setLayout(vbl);
		next.signalConnect("clicked", delegate(web_view, back));
		prev.signalConnect("clicked", delegate(web_view, forward));
		webView.signalConnect("url-changed", delegate(this, updateLocationBar));
		location_bar.signalConnect("return-pressed", delegate(this, updateWebView));
	}

	void show() {
		body.show();
	}

	void updateLocationBar(QWebView w) {
		QUrl u = w.url;
		String host = u.host;
		String path = u.path;
		_location_bar.setText(host + path);
	}

	void updateWebView(QLineEdit le) {
		String path = le.text;
		_url.setUrl("http://" + path);
		_web_view.load(url);
	}
};

QApplication app = new ();
SimpleWebViewer viewer = new ("http://konohascript.org");
viewer.show();
app.exec();

実行結果は次のようになります。

まとめ

konoha.qt4aパッケージを使えば、Qtライブラリを利用したリッチなGUIアプリケーションを、効率よく開発することができます。ぜひ一度お試し下さい。
最後に補足ですが、konoha.qt4パッケージは、横浜国立大学、倉光研究室に所属する修士2年と学部4年の学生二名によって開発されました(私ではありません)。QtのWebドキュメントから、KonohaScriptへのラッパーコードを20万行ほど自動生成して作成されました。