CheckButtonウィジェット


チェックボタン・ウィジェットについて触れてみる。 当然、チェックを入れる、入れないで、処理を分岐させたい。 マニュアルを見てみる。

あれ!?Synopsis(概要)に4項目しか無く、しかもチェックに関する物が見当たらない。 以前、ComboBoxTextにデフォルト文字を入れるのに、すぐ上位のComboBoxを使った。 という事は、今回はToggleButtonを参照してみる。

get_activeを発見。 gboolean型なので、チェックが入っていればTRUE、入っていなければFALSEを返す。 早速使ってみる。

#include <gtk/gtk.h>

GtkWidget *checkbutton1;
GtkWidget *checkbutton2;
GtkWidget *label1;
GtkWidget *label2;

//チェックが入っていればラベルをTRUE、入っていなければFALSEと表示
static void cb_button_clicked (GtkWidget *button, gpointer user_data)
{
  gboolean flag1;
  gboolean flag2;
  //チェックボタンがactiveかどうかをget
  flag1 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton1));
  flag2 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton2));
  if( flag1 == TRUE ){
    gtk_label_set_text(GTK_LABEL(label1), "CheckButton1:TRUE");
  }
  else{
    gtk_label_set_text(GTK_LABEL(label1), "CheckButton1:FALSE");
  }
  if( flag2 == TRUE ){
    gtk_label_set_text(GTK_LABEL(label2), "CheckButton2:TRUE");
  }
  else{
    gtk_label_set_text(GTK_LABEL(label2), "CheckButton2:FALSE");
  }
}

int main( int argc, char *argv[])
{
  GtkWidget *window;
  GtkWidget *vbox;
  GtkWidget *button;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_widget_set_size_request(window, 300, 200);
  gtk_container_set_border_width(GTK_CONTAINER(window), 10);

  vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 2);
  gtk_container_add(GTK_CONTAINER(window), vbox);
  checkbutton1 = gtk_check_button_new_with_label("CheckButton1");
  gtk_box_pack_start(GTK_BOX(vbox), checkbutton1, TRUE, TRUE, 0);
  checkbutton2 = gtk_check_button_new_with_label("CheckButton2");
  gtk_box_pack_start(GTK_BOX(vbox), checkbutton2, TRUE, TRUE, 0);
  button = gtk_button_new_with_label("Output");
  gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
  label1 = gtk_label_new("CheckButton1:");
  gtk_box_pack_start(GTK_BOX(vbox), label1, TRUE, TRUE, 0);
  label2 = gtk_label_new("CheckButton2:");
  gtk_box_pack_start(GTK_BOX(vbox), label2, TRUE, TRUE, 0);

  g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(cb_button_clicked), NULL);
  g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

チェックを入れずに「Output」ボタンをクリック。

CheckButton1のみにチェックを入れる

CheckButton2のみにチェックを入れる

念のため、両方にチェックを入れてみる。

これで、チェックボタンの情報取得ができるようになった。


ボタンの装飾


ボタン・ウィジェットだが、中にイメージとラベルを格納できるらしい。 試しにやってみる。

#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
  GtkWidget *window;
  GtkWidget *button;
  GtkWidget *label;
  GtkWidget *image;
  GtkWidget *hbox;

  gtk_init (&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW (window), "Image and Label of Button");
  gtk_widget_set_size_request(window, 300, 200);
  gtk_container_set_border_width(GTK_CONTAINER (window), 10);

  //ボタンを作成
  button = gtk_button_new();

  //画像とラベルのためのボックスを作成
  hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
  gtk_container_set_border_width(GTK_CONTAINER(hbox), 2);

  //ボタンのための画像を作成
  image = gtk_image_new_from_file("logo.png");

  //ボタンのためのラベルを作成
  label = gtk_label_new("ButtonLabel");

  //画像とラベルをボックスにパッキング
  gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 3);
  gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 3);

  gtk_container_add(GTK_CONTAINER(button), hbox);
  gtk_container_add(GTK_CONTAINER(window), button);

  g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
  gtk_widget_show_all(window);

  gtk_main ();

  return 0;
}

左にイメージ、右にラベルを格納してみた。 サンプルは無意味だが、使いようによっては、 「ファイルを開く」、「保存」などで、視覚的にボタンの役割を解りやすくする事ができる。


前章  | 目次 |  次章



トップ



/