ラジオボタン


メジャーなツール(ウィジェット)が残っていたので、サンプルを作成してみた。

#include <glib.h>

//アクティブなRadioButtonを変更した時の処理
static void cb_button_toggled(GtkRadioButton *widget, gpointer user_data)
{
  g_print( "Catch the toggle signal from the radio button%d.\n", GPOINTER_TO_INT(user_data));
  if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ){
    g_print( "The radio button%d id selected.\n", GPOINTER_TO_INT(user_data) );
  }
}

int main(int argc, char** argv)
{
  GtkWidget *window;
  GtkWidget *vbox;
  GtkWidget *radiobutton[2];
  GSList *group = NULL;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "GtkRadioButton");
  gtk_widget_set_size_request(window, 300, -1);
  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
  gtk_container_add(GTK_CONTAINER(window), vbox);

  //RadioButton0を配置
  radiobutton[0] = gtk_radio_button_new_with_label(group, "RadioButton0");
  gtk_box_pack_start(GTK_BOX(vbox), radiobutton[0], TRUE, TRUE, 0);

  //RadioButton1(RadioButton0とグループ)を配置
  radiobutton[1] = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radiobutton[0]), "RadioButton1");
  gtk_box_pack_start(GTK_BOX(vbox), radiobutton[1], TRUE, TRUE, 0);

  //RadioButton2(RadioButton0とグループ)を配置
  radiobutton[2] = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radiobutton[0]), "RadioButton2");
  gtk_box_pack_start(GTK_BOX(vbox), radiobutton[2], TRUE, TRUE, 0);

  //デフォルトでRadioButton1をアクティブにする
  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radiobutton[1]), TRUE);

  //RadioButton0をアクティブにした時のシグナル
  g_signal_connect(G_OBJECT(radiobutton[0]), "toggled", G_CALLBACK(cb_button_toggled), GINT_TO_POINTER(0));
  //RadioButton1をアクティブにした時のシグナル
  g_signal_connect(G_OBJECT(radiobutton[1]), "toggled", G_CALLBACK(cb_button_toggled), GINT_TO_POINTER(1));
  //RadioButton2をアクティブにした時のシグナル
  g_signal_connect(G_OBJECT(radiobutton[2]), "toggled", G_CALLBACK(cb_button_toggled), GINT_TO_POINTER(2));

  gtk_widget_show_all(window);
  gtk_main();

  return 0;
}

RadioButton2をクリックしてみる

 

RadioButton0をクリックしてみる

 

これで、ラジオボタンのシグナルを使えるようになった。


ツールバー


ウィジェットを並べてツールバーを作成する。

#include <glib.h>

//CheckButtonにチェックが入っているかで、文字を入れるか決める
static void cb_show_text(GtkWidget *widget, gpointer user_data)
{
  if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ){
    gtk_toolbar_set_style(GTK_TOOLBAR(user_data), GTK_TOOLBAR_BOTH);
  }
  else{
    gtk_toolbar_set_style(GTK_TOOLBAR(user_data), GTK_TOOLBAR_ICONS);
  }
}

//ツールアイテムを横に並べる
static void cb_set_horizontal(GtkToggleToolButton *widget, gpointer user_data)
{
  if( gtk_toggle_tool_button_get_active(widget) ){
    GtkOrientable *orientable;
    orientable = GTK_ORIENTABLE(g_object_get_data(G_OBJECT(user_data), "toolbar"));
    gtk_orientable_set_orientation(orientable, GTK_ORIENTATION_HORIZONTAL);
    gtk_widget_set_size_request(GTK_WIDGET(user_data), 400, -1);
  }
}

//ツールアイテムを縦に並べる
static void cb_set_vertical(GtkToggleToolButton *widget, gpointer user_data)
{
  if( gtk_toggle_tool_button_get_active(widget) ){
    GtkOrientable *orientable;
    orientable = GTK_ORIENTABLE(g_object_get_data(G_OBJECT(user_data), "toolbar"));
    gtk_orientable_set_orientation(orientable, GTK_ORIENTATION_VERTICAL);
    gtk_widget_set_size_request(GTK_WIDGET(user_data), 100, 300);
  }
}

//プログラムを終了する
static void cb_quit(GtkWidget *widget, gpointer user_data)
{
  gtk_main_quit();
}

int main(int argc, char** argv)
{
  GtkWidget *window;
  GtkWidget *toolbar;
  GtkWidget *widget;
  GtkToolItem *item;
  GSList *group;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "Toolbar");
  gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
  gtk_widget_set_size_request(window, 400, -1);

  //ツールバーを生成する
  toolbar = gtk_toolbar_new();
  gtk_container_add(GTK_CONTAINER(window), toolbar);
  //ツールバーのスタイルをBOTH(文字付き)に設定
  gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
  g_object_set_data(G_OBJECT(window), "toolbar", (gpointer)toolbar);

  //CheckButtonを生成する
  widget = gtk_check_button_new_with_label("Show text");
  item = gtk_tool_item_new();
  gtk_container_add(GTK_CONTAINER(item), widget);
  gtk_tool_item_set_tooltip_text(item, "Toggle wheter show text");
  //CheckButtonにチェックを入れておく
  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
  g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(cb_show_text), (gpointer)toolbar);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);

  //Separatorを挿入する
  item = gtk_separator_tool_item_new();
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);

  //水平表示させるツールボタンを生成する
  item = gtk_radio_tool_button_new_from_stock(NULL, GTK_STOCK_GO_FORWARD);
  gtk_tool_button_set_label(GTK_TOOL_BUTTON(item), "Horizontal");
  //水平表示をアクティブにする
  gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(item), TRUE);
  //垂直表示用ボタンとのグループ化の準備
  group = gtk_radio_tool_button_get_group(GTK_RADIO_TOOL_BUTTON(item));
  gtk_tool_item_set_tooltip_text(item, "Set the toolbar to horizontal");
  g_signal_connect(G_OBJECT(item), "toggled", G_CALLBACK(cb_set_horizontal), (gpointer)window);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);

  //垂直表示させるツールボタンを生成する
  item = gtk_radio_tool_button_new_from_stock(group, GTK_STOCK_GO_DOWN);
  gtk_tool_button_set_label(GTK_TOOL_BUTTON(item), "Vertical");
  gtk_tool_item_set_tooltip_text(item, "Set the toolbar to vertical");
  g_signal_connect(G_OBJECT(item), "toggled", G_CALLBACK(cb_set_vertical), (gpointer)window);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);

  //プログラムを終了させるツールボタンを生成する
  widget = gtk_image_new_from_stock(GTK_STOCK_QUIT, gtk_toolbar_get_icon_size(GTK_TOOLBAR(toolbar)));
  item = gtk_tool_button_new(widget, "Quit");
  gtk_tool_item_set_tooltip_text(item, "Exit this program");
  g_signal_connect(G_OBJECT(item), "clicked", G_CALLBACK(cb_quit), (gpointer)window);
  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);

  gtk_widget_show_all(window);
  gtk_main();

  return 0;
}

チェックボタンのチェックを外して、アイコン表示のみにする。

Verticalボタンをクリックすると、ツールバーが縦配列になる。

clickedと、その代わりに使えるシグナルを紹介してみる。

シグナル発生条件
clickedクリック(押して離された)時
enterマウスポインタがボタン領域に入った時
leaveマウスポインタがボタン領域から出た時
pressedマウスの左ボタンが押された時
releasedマウスの左ボタンが離された時


Expander


ウィンドウに詳細を任意で表示させるExpanderを扱ってみる。

#include <glib.h>

int main(int argc, char** argv)
{
  GtkWidget *window;
  GtkWidget *vbox;
  GtkWidget *hbox;
  GtkWidget *label;
  GtkWidget *button;
  GtkWidget *expander;

  gtk_init(&argc, &argv);
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "GtkExpander");
  gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
  gtk_container_set_border_width(GTK_CONTAINER(window), 5);
  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
  gtk_container_add(GTK_CONTAINER(window), vbox);

  //常時表示さておくラベル
  label = gtk_label_new("Expander Sample. Click on the triangle for details.");
  gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);

  //Expanderを生成
  expander = gtk_expander_new("Details");
  gtk_box_pack_start(GTK_BOX(vbox), expander, FALSE, FALSE, 0);
  //デフォルトでExpanderは非表示にしておく
  gtk_expander_set_expanded(GTK_EXPANDER(expander), FALSE);

  //Expanderで表示と非表示を切り替えられるラベルを生成
  label = gtk_label_new("Details could be described here.");
  gtk_container_add(GTK_CONTAINER(expander), label);

  hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
  gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);

  //プログラムを終了するボタンを生成
  button = gtk_button_new_from_stock(GTK_STOCK_QUIT);
  g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_main_quit), NULL);
  gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);

  gtk_widget_show_all(window);
  gtk_main();

  return 0;
}

Expander(Details)をクリックしてみる。

非表示のラベルが表示された。 これで、使えるウィジェットが少し増えた。


前章  | 目次 |  次章



トップ



/