GtkEntryCompletion


先前看過 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;
}

一個執行的結果如下所示: