文字輸入元件(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 );
|
如果我們想在用戶輸入文字時進行響應,可以為activate或changed信號設置回呼函式。當用戶在文字輸入元件內部按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: %sn", 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;
}
|
1 則留言