先前看過 GtkEntry 的範例,主要是作為使用者輸入文字之用,您可以搭配GtkEntryCompletion來讓GtkEntry擁有自動完成功能,這需要使用到GtkListStore與GtkTreeIter,這兩個類別在 GtkComboBox
與 GtkListStore 曾經介紹過,只要您會使用 GtkEntry、GtkListStore與GtkTreeIter,製作自動完成就不是什麼困難的事。
以下直接使用實例來示範:
- gtk_entrycompletion_demo.c
#include<gtk/gtk.h>
int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *vbox; GtkWidget *label; GtkWidget *entry; GtkEntryCompletion *completion; GtkListStore *store; GtkTreeIter iter; int i;
// 作為自動完成時的項目提示 gchar *topics[] = { "C", "C++", "Java", "JSP", "JSF", "JUnit", "JavaScript" };
gtk_init (&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "GtkEntryCompletion"); gtk_window_set_default_size(GTK_WINDOW(window), 300, 50);
// 使用GtkListStore儲存項目提示 store = gtk_list_store_new(1, G_TYPE_STRING); for(i = 0; i < 7; i++) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, topics[i], -1); }
// 將GtkListStore設定給GtkEntryCompletion completion = gtk_entry_completion_new(); gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(store)); gtk_entry_completion_set_text_column (completion, 0);
label = gtk_label_new("請輸入技術主題");
// 建立GtkEntry entry = gtk_entry_new();
// 設定GtkEntryCompletion gtk_entry_set_completion(GTK_ENTRY(entry), completion);
vbox = gtk_vbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX (vbox), entry, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER (window), vbox);
g_signal_connect(GTK_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all (window); gtk_main();
return 0; }
一個執行的結果如下所示:

|
|