2007年09月15日

[006] GUI部品を使った簡単な例〜まとめ〜

前回、前々回扱った例題でのプログラミングの流れをまとめてみました。
プログラミングの流れとしては

  1. gladeでGUI部品(ウィジット)を配置する。
  2. 配置したウィジットの各プロパティ(イベントハンドラを含む)を設定する。
  3. エディタを使いイベントハンドラの中身を記述する。


となります。

1. ウィジットの配置
例題でのウィジットの階層構造は下図のようになっています。
Screenshot075.png

例題ではウインドウにテーブルを貼り付け、テーブルの各セルにラベル、テキストエントリ、ボタンを貼り付けています。
table1は行数2、列数3のテーブルであり、
各ウィジットの水平、垂直位置は
label1:0,0
entry1:1,0
button1:2,0
label2:0,1

2.各ウィジットのプロパティの設定
[window1]
「ウィジット」タブのプロパティ
サイズ変更→「いいえ」


「シグナル」タブのプロパティ
シグナル→「destroy」
ハンドラ→「gtk_main_quit」



[table1]
行数→2
列数→3



[label1]
「ウィジット」タブのプロパティ
ラベル→「あなたのお名前は?」



[entry1]
デフォルトのまま


[button1]
「ウィジット」タブのプロパティ
ラベル→「Ok」


「シグナル」タブのプロパティ
シグナル→「clicked」
ハンドラ→「on_button1_clicked」(デフォルト)



[label2]
「ウィジット」タブのプロパティ
ラベル→「」(空白)


「パッキング」タブのプロパティ
列の占有→3


ちなみに部品の配置やプロパティの設定は「interface.h」、「interface.c」の中に記述されます。これらのファイルはエディタで編集してはいけません。

3.イベントハンドラの記述
プロパティで設定したbutton1のクリックイベントに対するハンドラ「on_button1_clicked」はファイルcallbacks.cの中に自動的に空の関数として生成されています。callbacks.cを編集することで目的のイベントを処理します。
例題でのボタンを押されたときに行う処理は単純にテキストエントリから文字列を取得し、label2の文字列を設定するだけです。
しかし、このとき一つ問題があります。それは
on_button1_clicked関数へ渡されるウィジットはbutton1だけである

ということです。
ではテキストエントリの内容はどうやって取得すればよいのでしょうか?
gladeは一つのウィジットから別のウィジットを取得するための関数を用意してくれます。それが
widget = lookup_widget(GTK_WIDGET(button),"entry1");
entry = GTK_ENTRY(widget);

の部分で、「lookup_widget」という関数を使って「entry1」という名前のウィジットを取得しています。ちなみにこの「lookup_widget」関数はgladeが生成するファイルのうち「support.h」、「support.c」で定義されています。また「GTK_WIDGET(button)」の部分の意味はGtkButton型からGtkWidget型へのキャストを意味しています。同様に「GTK_ENTRY(widget)」の部分はGtkWidget型からGtkEntry型へのキャストを意味します。

テキストエントリが取得できれば、そのエントリから
gchar *name = gtk_entry_get_text(entry);

のようにして文字列を取得することができます。ここで注意しなければいけないのは、「gtk_entry_get_text」関数が返すのはchar型のポインタではなく、gchar型のポインタであることです。従って文字列操作関数も標準Cライブラリのものではなく、GLibのものを使う必要があります。

answer = g_strdup_printf("%sさん !!こんにちは!!",name);

の部分で使っている「g_strdup_printf」関数も標準Cライブラリの「sprintf」に相当するGLib関数です。他には文字列から実数へ変換する関数「g_strtod 」などもよく使います。これは
gdouble x = g_strtod(text,NULL);

のように使います。



《参考情報》
anjutaの「ヘルプ」→「Anjutaチュートリアル」をクリックすると英語ですがここの例題でやったようなチュートリアルが見れます。

「g_strdup_printf」などのGLIb関数のリファレンスは
http://library.gnome.org/devel/glib/unstable/glib-utilities.html
などで参照できます。日本語訳のサイトもありましたが、現在サーバがダウンしているようです。

また「devhelp」をインストールすることで、GLibやGTKの各種リファレンスを参照することができます。ubuntuであれば
sudo apt-get install devhelp

でdevhelpがインストールできます。devhelpの他にGLibやGTKのドキュメントもインストールする必要があります。
sudo apt-get install libglib2.0-doc libgtk2.0-doc

ubuntuであればメニューから「アプリケーション」→「プログラミング」→「Devhelp」でdevhelpが起動します。
posted by knyakki at 13:14| Comment(1) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
失礼いたします
Posted by エロ at 2008年01月25日 23:49
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。