以下是一个示例代码,演示了如何在GtkEntryCompletion中使用GtkTreeStore作为父项和子项:
#include
enum {
COLUMN_TEXT = 0,
NUM_COLUMNS
};
void on_entry_changed(GtkEntry *entry, GtkTreeModel *model) {
gchar *text = gtk_entry_get_text(entry);
// 清除之前的列表项
gtk_list_store_clear(GTK_LIST_STORE(model));
if (text != NULL && strlen(text) > 0) {
GtkTreeIter iter;
// 添加父项
gtk_list_store_append(GTK_LIST_STORE(model), &iter);
gtk_list_store_set(GTK_LIST_STORE(model), &iter,
COLUMN_TEXT, text,
-1);
// 添加子项
gtk_list_store_append(GTK_LIST_STORE(model), &iter);
gtk_list_store_set(GTK_LIST_STORE(model), &iter,
COLUMN_TEXT, g_strdup_printf("子项1: %s", text),
-1);
gtk_list_store_append(GTK_LIST_STORE(model), &iter);
gtk_list_store_set(GTK_LIST_STORE(model), &iter,
COLUMN_TEXT, g_strdup_printf("子项2: %s", text),
-1);
}
}
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
// 创建一个GtkEntry
GtkWidget *entry = gtk_entry_new();
// 创建一个GtkTreeStore作为GtkEntryCompletion的模型
GtkTreeStore *model = gtk_tree_store_new(NUM_COLUMNS, G_TYPE_STRING);
// 创建一个GtkEntryCompletion,并设置模型
GtkEntryCompletion *completion = gtk_entry_completion_new();
gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(model));
// 设置GtkEntryCompletion的文本列
gtk_entry_completion_set_text_column(completion, COLUMN_TEXT);
// 将GtkEntry与GtkEntryCompletion关联
gtk_entry_set_completion(GTK_ENTRY(entry), completion);
// 监听GtkEntry的文本更改事件
g_signal_connect(entry, "changed", G_CALLBACK(on_entry_changed), model);
GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 0);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
这个示例代码创建了一个包含GtkEntry和GtkEntryCompletion的窗口。当用户在GtkEntry中输入文本时,GtkEntryCompletion会显示一个下拉列表,其中包括父项和子项。