GTK+ 2.0 教学-文字输入元件

文字输入元件(Entry widget)允许在一个单行文字框里输入和显示一行文字。文字可以用函式进行操作,如将新的文字替换、前插、追加到文字输入元件的当前内容中。

用下面的函式创建一个文字输入元件:

GtkWidget *gtk_entry_new( void );

下面的函式改变文字输入元件当前的文字内容。

void gtk_entry_set_text( GtkEntry    *entry,
                         const gchar *text );

gtk_entry_set_text() 函式用新的内容(contents)取代文字输入元件当前的内容。你可以注意到文字输入元件的类别(class Entry)体现了可编辑的介面(Editable interface)(是的,gobject提供了类似Java的介面),它包含更多的函式来操作内容。

文字输入元件的内容可以用下面的函式获取。这在下面介绍的回呼函式中是很有用的。

const gchar *gtk_entry_get_text( GtkEntry *entry );

这个函式传回的值在其内部被使用,不要用free()或g_free()释放它。

如果我们不想用户通过输入文字改变文字输入元件的内容,我们可以改变它的可编辑状态。

void gtk_editable_set_editable( GtkEditable *entry,
                                gboolean     editable );

上面的函式可以让我们通过传递一个TRUE或 FALSE 值作为editable参数来改变文字输入元件的可编辑状态。

如果想让文字输入元件输入的文字不显示(比如用于接收密码),可以使用下面的函式,它也是取一个布林值作为参数

void gtk_entry_set_visibility( GtkEntry *entry,
                               gboolean  visible );

文字里的某一区域可以用下面的函式设置为被选择。这个常在为文字输入元件设置了一个预设值时使用,以方便用户删除它。

void gtk_editable_select_region( GtkEditable *entry,
                                 gint         start,
                                 gint         end );

如果我们想在用户输入文字时进行响应,可以为activatechanged信号设置回呼函式。当用户在文字输入元件内部按ENTER键时引发Activate信号;在每次文字输入元件的文字发生变化时引发Changed信号,比如,每输入或删除一个字元。

下面的程式码是一个使用文字输入元件的范例。

#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>

static void enter_callback( GtkWidget *widget,
                            GtkWidget *entry )
{
  const gchar *entry_text;
  entry_text = gtk_entry_get_text (GTK_ENTRY (entry));
  printf ("Entry contents: %s\n", entry_text);
}

static void entry_toggle_editable( GtkWidget *checkbutton,
                                   GtkWidget *entry )
{
  gtk_editable_set_editable (GTK_EDITABLE (entry),
                             GTK_TOGGLE_BUTTON (checkbutton)->active);
}

static void entry_toggle_visibility( GtkWidget *checkbutton,
                                     GtkWidget *entry )
{
  gtk_entry_set_visibility (GTK_ENTRY (entry),
			    GTK_TOGGLE_BUTTON (checkbutton)->active);
}

int main( int   argc,
          char *argv[] )
{

    GtkWidget *window;
    GtkWidget *vbox, *hbox;
    GtkWidget *entry;
    GtkWidget *button;
    GtkWidget *check;
    gint tmp_pos;

    gtk_init (&argc, &argv);
/* 创建一个新视窗 */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_size_request (GTK_WIDGET (window), 200, 100);
    gtk_window_set_title (GTK_WINDOW (window), "GTK Entry");
    g_signal_connect (window, "destroy",
                      G_CALLBACK (gtk_main_quit), NULL);
    g_signal_connect_swapped (window, "delete-event",
                              G_CALLBACK (gtk_widget_destroy),
                              window);

    vbox = gtk_vbox_new (FALSE, 0);
    gtk_container_add (GTK_CONTAINER (window), vbox);
    gtk_widget_show (vbox);

    entry = gtk_entry_new ();
    gtk_entry_set_max_length (GTK_ENTRY (entry), 50);
    g_signal_connect (entry, "activate",
		      G_CALLBACK (enter_callback),
		      entry);
    gtk_entry_set_text (GTK_ENTRY (entry), "hello");
    tmp_pos = GTK_ENTRY (entry)->text_length;
    gtk_editable_insert_text (GTK_EDITABLE (entry), " world", -1, &tmp_pos);
    gtk_editable_select_region (GTK_EDITABLE (entry),
			        0, GTK_ENTRY (entry)->text_length);
    gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
    gtk_widget_show (entry);

    hbox = gtk_hbox_new (FALSE, 0);
    gtk_container_add (GTK_CONTAINER (vbox), hbox);
    gtk_widget_show (hbox);

    check = gtk_check_button_new_with_label ("Editable");
    gtk_box_pack_start (GTK_BOX (hbox), check, TRUE, TRUE, 0);
    g_signal_connect (check, "toggled",
	              G_CALLBACK (entry_toggle_editable), entry);
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
    gtk_widget_show (check);

    check = gtk_check_button_new_with_label ("Visible");
    gtk_box_pack_start (GTK_BOX (hbox), check, TRUE, TRUE, 0);
    g_signal_connect (check, "toggled",
	              G_CALLBACK (entry_toggle_visibility), entry);
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
    gtk_widget_show (check);

    button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
    g_signal_connect_swapped (button, "clicked",
			      G_CALLBACK (gtk_widget_destroy),
			      window);
    gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
    gtk_widget_set_can_default (button, TRUE);
    gtk_widget_grab_default (button);
    gtk_widget_show (button);

    gtk_widget_show (window);

    gtk_main();

    return 0;
}

Comments are closed.