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;
以上です。