Gtk3でダイアログにWidgetを追加する



Gtk3で書いているアプリケーションで、カスタムダイアログが必要となった際の記録です。

最初にGtkDialogを使ったときに、 ダイアログ内に追加したWidgetが表示されなかったため、少し時間を取られたので記事にしています。

SpinButtonを追加したGtkDialog

Gtk3でダイアログボックスを使用するGtkDialogにWidgetを追加する場合、まずダイアログから、ダイアログ内のコンテナウィジェットへのポインタを取り出します。
GtkWidget *    gtk_dialog_get_content_area ()
によって取得したコンテナにGtkBoxなどのWidgetを追加していくことで、ダイアログをカスタマイズします。

また、
GtkWidget *    gtk_dialog_get_action_area ()
もありますが、こちらはdeprecated (廃止予定に非推奨)となっています。

そして、ダイアログ内へ追加したWidgetを、gtk_dialog_run() したときに表示するには、
gtk_widget_show_all(dialog);
を実行しておきます。
GtkWindowに対して使うことが多いと思いますが、dialogにも有効でした。

ソースコード

作成中のプログラムからそのままコピーしてきたコードなので、オリジナル関数(et_error())などが入っていますが上手くやってください。



 
GtkWidget *dialog;
 
GtkDialogFlags flags = GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT;
 
dialog = gtk_dialog_new_with_buttons ("New Document",
 
 
 
NULL,
 
 
 
flags,
 
 
 
"_OK",
 
 
 
GTK_RESPONSE_ACCEPT,
 
 
 
"_Cancel",
 
 
 
GTK_RESPONSE_REJECT,
 
 
 
NULL);

 
GtkWidget *hbox_w = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
 
GtkWidget *hbox_h = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
 
GtkWidget *spin_w = gtk_spin_button_new_with_range(0, 20000, 100);
 
GtkWidget *spin_h = gtk_spin_button_new_with_range(0, 20000, 100);
 
GtkWidget *label_w = gtk_label_new_with_mnemonic("width ");
 
GtkWidget *label_h = gtk_label_new_with_mnemonic("height");
 
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_w), 1200);
 
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_h), 600);
 
GtkWidget *content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
 
gtk_box_pack_start(GTK_BOX(hbox_w), label_w, true, true, 0);
 
gtk_box_pack_start(GTK_BOX(hbox_h), label_h, true, true, 1);
 
gtk_box_pack_end(GTK_BOX(hbox_w), spin_w, true, true, 0);
 
gtk_box_pack_end(GTK_BOX(hbox_h), spin_h, true, true, 1);
 
gtk_box_pack_start(GTK_BOX(content), hbox_w, true, true, 0);
 
gtk_box_pack_start(GTK_BOX(content), hbox_h, true, true, 1);
 
gtk_widget_show_all(dialog);

 
gint result = gtk_dialog_run (GTK_DIALOG (dialog));
 
switch (result)
 
{
 
 
case GTK_RESPONSE_ACCEPT:
 
 
 
{
 
 
 
 
vg->rect.w = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin_w));
 
 
 
 
vg->rect.h = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin_h));
 
 
 
 
et_debug("size:%f,%f,%f,%f\n",
 
 
 
 
 
vg->rect.x, vg->rect.y, vg->rect.w, vg->rect.h);
 
 
 
}
 
 
 
break;
 
 
default:
 
 
 
et_debug("Cancel\n");
 
 
 
break;
 
}
 
gtk_widget_destroy (dialog);

 
return false;


以上です。

このブログの人気の投稿

GIMP2.8でイラストにペン入れを行う

squid3プロキシサーバの設定(Ubuntu13.10)

Ubuntu13.04で使える動画編集ソフト一覧