EntryとButton



Entryの復習。6章で扱ったEntryウィジェットのサンプルを、構造体を使わずに少し変えてみる。

#include <glib.h>

GtkWidget *label2;

//Entryに入力した文字列をEnterキーで標準出力に表示
static void cb_entry(GtkEntry *entry, gpointer data)
{
  g_print( "%s\n", gtk_entry_get_text(entry) );
}

//Entryに入力した文字列をLabel2に表示
static void cb_button(GtkButton *button, gpointer data)
{
  const gchar *text;
  char buf[256];

  text = gtk_entry_get_text(GTK_ENTRY(data));
  sprintf(buf, "%s", text);
  gtk_label_set_text(GTK_LABEL(label2), buf);
}

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

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "Entry");
  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);

  hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
  gtk_container_add(GTK_CONTAINER(vbox), hbox);

  label1 = gtk_label_new("Input:");
  gtk_box_pack_start(GTK_BOX(hbox), label1, FALSE, FALSE, 0);

  entry = gtk_entry_new();
  g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(cb_entry), NULL);
  gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);

  //ストックアイテムからテキストを組むボタンを生成
  button = gtk_button_new_from_stock(GTK_STOCK_APPLY);
  g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(cb_button), (gpointer)entry);
  gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);

  label2 = gtk_label_new("Output");
  gtk_box_pack_start(GTK_BOX(vbox), label2, FALSE, FALSE, 0);

  gtk_widget_show_all(window);
  gtk_main();

  return 0;
}

まずEntryに文字列を入力する。

そしてEnterキーを押してみる。

次に適用(A)ボタンをクリックしてみる。

ストックアイテムと組み合わせたボタンなので、Alt + Aでも同様の動作を行う。


スピンボタン




最大値〜最小値の間で、値を増減させるボタンである。サンプルを作ってみる

#include <glib.h>

GtkWidget *label2;

//変化した値を標準出力に表示
static void cb_value_changed(GtkSpinButton *spinbutton, gpointer data)
{
  g_print( "value = %f\n", gtk_spin_button_get_value(spinbutton) );
}

//値が決まったらLabel2に出力
static void cb_button(GtkButton *button, gpointer data)
{
  const gchar *text;
  char buf[256];

  text = gtk_entry_get_text(GTK_ENTRY(data));
  sprintf(buf, "%s", text);
  gtk_label_set_text(GTK_LABEL(label2), buf);
}

int main(int argc, char** argv)
{
  GtkWidget *window;
  GtkWidget *vbox;
  GtkWidget *hbox;
  GtkWidget *label1;
  GtkWidget *spinbutton;
  GtkWidget *button;
  //最小値、最大値、ステップを指定
  gdouble min = 0.0, max = 100.0, step = 0.1;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "SpinButton");
  gtk_container_set_border_width(GTK_CONTAINER(window), 5);
  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, 5);
  gtk_container_add(GTK_CONTAINER(window), vbox);

  hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
  gtk_container_add(GTK_CONTAINER(vbox), hbox);

  label1 = gtk_label_new("Input:");
  gtk_box_pack_start(GTK_BOX(hbox), label1, FALSE, FALSE, 0);

  //スピンボタンの生成
  spinbutton = gtk_spin_button_new_with_range(min, max, step);
  //値の桁数を指定
  gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinbutton), 2);
  //上限値と下限値を設ける
  gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinbutton), TRUE);
  g_signal_connect(G_OBJECT(spinbutton), "value-changed", G_CALLBACK(cb_value_changed), NULL);
  gtk_box_pack_start(GTK_BOX(hbox), spinbutton, TRUE, TRUE, 0);

  button = gtk_button_new_from_stock(GTK_STOCK_APPLY);
  g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(cb_button), (gpointer)spinbutton);
  gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);

  label2 = gtk_label_new("value");
  gtk_box_pack_start(GTK_BOX(vbox), label2, FALSE, FALSE, 0);

  gtk_widget_show_all(window);
  gtk_main();

  return 0;
}

+ボタンをクリックして値を増やす。

+ボタンや-ボタンで増減させた値を標準出力でモニターしてみる。

ここでは目的値を1.00とする。

適用(A)ボタンをクリックしてLabel2に出力してみる。

これで、少しはスピンボタンが使えるようになった。


テキストビュー



次に、テキストビュー・ウィジェットを使ってみる。

#include <glib.h>

static void set_text(GtkTextView *textview, const gchar *text)
{
  GtkTextBuffer *buffer;

  //GtkTextViewからGtkTextBufferを取得する
  buffer = gtk_text_view_get_buffer(textview);
  gtk_text_buffer_set_text(buffer, text, -1);
}

static void print_text(GtkWidget *widget, gpointer data)
{
  GtkTextBuffer *buffer;
  GtkTextIter start, end;
  gchar *utf8_text;

  buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(data));
  //開始行のGtkTextIterを取得(行番号は0から開始)
  gtk_text_buffer_get_start_iter(buffer, &start);
  //最終行のGtkTextIterを取得
  gtk_text_buffer_get_end_iter(buffer, &end);
  //startからendまでの行のテキストを取得(UTF8でエンコーディングされ、新しく領域を確保)
  utf8_text = gtk_text_buffer_get_text(buffer, &start, &end, TRUE);
  //標準出力にテキストを表示
  g_print( "%s\n", utf8_text);
  g_free(utf8_text);
}

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

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "TextView");
  gtk_widget_set_size_request(window, 300, 100);
  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);

  scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
  gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_SHADOW_ETCHED_OUT);
  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
  gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0);

  //TextViewを生成
  textview = gtk_text_view_new();
  gtk_container_add(GTK_CONTAINER(scrolledwindow), textview);
  //TextViewに表示する文字列
  set_text(GTK_TEXT_VIEW(textview),
    "This is a sample program of GtkTextView.\n"
    "このプログラムはGtkTextViewウィジェットのサンプルです。\n");

  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);

  button = gtk_button_new_from_stock(GTK_STOCK_APPLY);
  g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(print_text), (gpointer)textview);
  gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);

  gtk_widget_show_all(window);
  gtk_main();

  return 0;
}

スクロールウィンドウを使ってみた。

 

適用(A)をクリックすると標準出力にテキストが表示される。

gtk_text_buffer_get_textはメモリ領域を確保するので、g_freeでの開放を忘れないようにする。


前章  | 目次 |  次章



トップ



/