AnjutaによるGtkプログラミング
津路です。
Anjutaは、何度か取り上げていますが、今回もGtk素人として使ってみました。
widgetにハンドラを追加する手順を以下、記載します。
1.Anjutaにて新規プロジェクトを、Gtkを選んで作ります。
次に、src配下にある、uiを開くと、uiファイルが見えます。
中身は、UTF-8コードのxmlファイルです。
interfaceをトップレベルとし、ObjectとしてGtkWindowがデフォルトで配置されています。
2.ここに、ボタンを追加します。
AnjutaからはGUI編集できないので、Gladeを起動し、目的のuiを開きます。
ボタンを追加しましたら、次は、シグナルタブを、ボタンのプロパティウィンドウから選びます。
ここで、GtkButtonの行に、clickedという項目があります。
ハンドラーの名前に、bを入力すると、候補が表示され、button1_clicked_cbと表示されます。エンターで確定します。
ユーザーデータでは、ハンドラーに引き渡すオブジェクトを選択できます。
「交換」や「後で」というチェック項目もあります。
最右端のDアイコンをクリックすると、リファレンスマニュアルが起動して、この場合clicked signalの内容が表示されました。
リファレンスマニュアル
3.ハンドラの名前が決まったところで、次は、Anjutaに切り替え、
main.cにハンドラを記載します。リファレンスマニュアルに記載のとおりの関数定義をします。
void button1_clicked_cb(GtkButton *button, qpointer user_data)
{
}
関数にて、メッセージウィンドウをモーダルで起動したいとします。
gtk_message_dialog_newという関数で作成できるようです。
GtkWidget*w = gtk_message_dialog_new(button, GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTON_OK, "button clicked");
とし、これを表示するには、
gtk_dialog_run(GTK_DIALOG(w));
という変な名前の関数を使います。gtkでは、GTK_DIALOGなどとcastをしないとだめだそうです。
ですので、上記のダイアログを作成するときの第一引数は、コンパイルできるものの、castしないと駄目です。
更に、buttonを第一引数にすると、実行時に、wはnullとなります。ボタンもGtkWidgetなのですが、ここでは親ウィンドウが必要です。
トップレベルウィンドウを取得する関数が見つかりました。
GtkWidget *top = gtk_widget_get_toplevel(button);
w = gtk_message_dialog_new(GTK_WINDOW(top), ...);
gint ret = gtk_dialog_run(GTK_DIALOG(w)); //起動
//retに、ユーザが選択した結果が格納される
gtk_widget_destroy(w); //破棄
とすると、ダイアログが起動しました。