![]() |
![]() |
![]() |
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での開放を忘れないようにする。