Glade 3 でGUI開発
(2008.8.7)
Gtk+/GNOME アプリケーションを開発するための、ユーザインターフェイスデザイナ Glade について。
Gladeとは
GUIアプリケーションを作るとき、ウィンドウを開いたり部品 (コントロール) を配置するプログラムをいちいち手で書くのは現実的ではありません。余白などはプログラム上で数値を書いてもピンときませんし。
Gladeは、Gtk+/GNOMEアプリケーションのウィンドウなどをGUIでデザインできます。
Gladeが生成するgladeファイルは、C/C++, Python などで扱えます。
Gladeのインストール
Fedora 9 Linux には Glade3 バージョン3.4.4のパッケージが用意されています。yumコマンドでインストールします。
# yum install glade3
Note.
|
やってみよう
簡単なGUIアプリを作ってみましょう。
gladeを開き、簡単なダイアログボックスを作ります。ボタンのプロパティで、コールバック関数の名前を設定してください。
Glade3はGUIデザインを表現する glade ファイルを出力するだけです。プログラムでそのファイルを読み込んで、ウィンドウなどを構築させます。
- #define GTK_DISABLE_DEPRECATED 1
- #define LIBGLADE_DISABLE_DEPRECATED 1
- #include <gtk/gtk.h>
- #include <glade/glade.h> // --------- (1)
- G_BEGIN_DECLS
- void on_button2_clicked();
- G_END_DECLS
- void on_button2_clicked() {
- printf("clicked!\n");
- }
- int main(int argc, char* argv[]) {
- GladeXML* xml;
- GtkWidget* window;
- gtk_init(&argc, &argv);
- xml = glade_xml_new("glade_test.glade", NULL, NULL); // --- (2)
- if (!xml) {
- printf("glade file error.\n");
- return 1;
- }
- window = glade_xml_get_widget(xml, "window"); // --- (3)
- glade_xml_signal_autoconnect(xml); // --- (4)
- g_object_unref(G_OBJECT(xml));
- gtk_widget_show(window);
- gtk_main();
- return 0;
- }
順に説明しますと、
- <glade/glade.h> をincludeします。
- glade_xml_new() 関数にgladeファイルのファイル名を渡して、glade XMLデータを読み込みます。文字列データからXML木を構築するときは、glade_xml_new_from_buffer() を使います。XML木を構築した後で、ノードを追加したり削除したりはできないようです。
- Widgetへの参照は、glade_xml_get_widget() で得られます。内部の動作を追っていませんが、このタイミングで各widgetが生成されるのだろうと思います。
- シグナルのコールバック関数への接続は、glade_xml_signal_autoconnect() で、いっぺんに、自動的にできます。シンボル名で探すので、コールバック関数は、Cスタイルで書かないといけません。プロトタイプ宣言をG_BEGIN_DECLS / G_END_DECLS で囲みます。
コンパイルは、例えば、次のようにします。
$ gcc -Wall first.cc `pkg-config --cflags --libs libglade-2.0 gmodule-2.0` -lstdc++
glade_xml_signal_autoconnect() を使うときは、libgmodule-2.0 も必要になります。
C++の場合
プログラムを C++ で書く場合は次のようになります。C++では glade_xml_signal_autoconnect() が使えないので、一手間増えます。
次のサンプルコードは、gtkmm での派生クラスのサンプルも兼ねています。
- #define GTKMM_DISABLE_DEPRECATED 1
- #include <libglademm/xml.h>
- #include <gtkmm.h>
- #include <iostream>
- #include <cassert>
- typedef Glib::RefPtr<Gnome::Glade::Xml> glade_ref_t;
- // 派生クラスのサンプル
- class MyDialog: public Gtk::Dialog
- {
- typedef Gtk::Dialog super;
- glade_ref_t glade_xml;
- public:
- MyDialog(BaseObjectType* cobject, const glade_ref_t& glade_xml_): // (1)
- super(cobject),
- glade_xml(glade_xml_)
- {
- Gtk::Widget* drawing = NULL;
- glade_xml->get_widget("drawingarea", drawing); // (2)
- assert(drawing);
- // (3)
- glade_xml->connect_clicked("button2",
- sigc::mem_fun(*this, &MyDialog::on_button_clicked));
- }
- void on_button_clicked() {
- std::cout << "clicked!\n";
- }
- };
- int main(int argc, char* argv[]) {
- Gtk::Main kit(argc, argv);
- glade_ref_t glade_xml;
- try {
- glade_xml = Gnome::Glade::Xml::create("glade_test.glade"); // (4)
- }
- catch (const Gnome::Glade::XmlError& ex) {
- std::cerr << ex.what() << std::endl;
- return 1;
- }
- MyDialog* dialog = NULL;
- glade_xml->get_widget_derived("window", dialog); // (5)
- assert(dialog);
- kit.run(*dialog);
- return 0;
- }
- gtkmmのクラスを派生させるときは、決まったコンストラクタを持たなければなりません。cobject はそのままスーパクラスへ渡します。
- widgetへの参照を得るのは、get_widget() メソッドです。第2引数に得たいクラスのポインタを渡します。dynamic_cast は不要です。
- シグナルの接続ですが、ボタンについては簡便なメソッドが用意されています。それ以外のときは、普通にgtkmmの流儀で接続します。
- gladeファイルを読み込むのは、create() クラスメソッドです。
- 派生クラスのインスタンスを得たいときは、get_widget() ではなく、get_widget_derived() を呼び出すようにします。
コンパイルは次のようにします。
$ gcc -Wall sample02.cc `pkg-config --cflags --libs libglademm-2.4` -lstdc++
外部リンク
- gtkmm - the C++ interface to GTK+
- gtkmm の公式サイト。Documentation のセクションで提供される、Programming with gtkmm が優れている。
- gtkmm 入門
- さまざまなサンプルプログラムがある。
Note.