2013年2月27日水曜日

[GTK+]テキスト入力欄

  • テキスト入力欄に入力した文字列を label に反映する
  • ボタンをクリックすると button_click() が呼び出され、その中で entry に書き込まれた文字列を gtk_entry_get_text() で読み出し、label に gtk_label_set_text() で反映する
Example: entry.c
#include <gtk/gtk.h>

typedef struct main_dialog_type {
    GtkWidget *window;
    GtkWidget *button;
    GtkWidget *table;
    GtkWidget *entry;
    GtkWidget *label;
} MainDialog;

/* ボタンがクリックされたら entry に入力された文字列を読み込み label を更新する */
void button_click(GtkWidget *widget, gpointer data)
{
    const gchar *text;
    char buf[256];

    text = gtk_entry_get_text(GTK_ENTRY(((MainDialog*)data)->entry));
    sprintf(buf, "%s", text);
    gtk_label_set_text(GTK_LABEL(((MainDialog*)data)->label), buf);
}

int main(int argc, char **argv)
{
    MainDialog dialog;

    gtk_init(&argc, &argv);

    dialog.window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(dialog.window), "GtkEntry");
    gtk_window_set_position(GTK_WINDOW(dialog.window), GTK_WIN_POS_CENTER);
    /* table を作成し、各要素を table 上に配置する */
    /*  0          1          2
     * 0+----------+----------+
     *  |          |          |
     * 1+----------+----------+
     *  |          |          |
     * 2+----------+----------+
     */
    /* gtk_table_attach_defaults(*table, *child, left_attach, right_attach, top_attach, bottom_attach); */

    dialog.table = gtk_table_new(2, 2, TRUE);
    gtk_container_add(GTK_CONTAINER(dialog.window), dialog.table);

    /* entry を下記の場所に配置する */
    /*  0          1          2
     * 0+----------+----------+
     *  |   XXXX   |          |
     * 1+----------+----------+
     *  |          |          |
     * 2+----------+----------+
     */
    dialog.entry = gtk_entry_new();
    gtk_table_attach_defaults(GTK_TABLE(dialog.table), dialog.entry, 0, 1, 0, 1);

    /* label を下記の場所に配置する */
    /*  0          1          2
     * 0+----------+----------+
     *  |          |   XXXX   |
     * 1+----------+----------+
     *  |          |          |
     * 2+----------+----------+
     */
    dialog.label = gtk_label_new("blank");
    gtk_table_attach_defaults(GTK_TABLE(dialog.table), dialog.label, 1, 2, 0, 1);

    /* button を下記の場所に配置する */
    /*  0          1          2
     * 0+----------+----------+
     *  |          |          |
     * 1+----------+----------+
     *  |   XXXXXXXXXXXXXXX   |
     * 2+----------+----------+
     */
    dialog.button = gtk_button_new_with_label("Enter");
    gtk_table_attach_defaults(GTK_TABLE(dialog.table), dialog.button, 0, 2, 1, 2);
    g_signal_connect(dialog.button, "clicked", G_CALLBACK(button_click), &dialog);

    gtk_widget_show_all(dialog.window);

    g_signal_connect_swapped(G_OBJECT(dialog.window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

    gtk_main();

    return 0;
}
実行結果

0 件のコメント:

コメントを投稿