我一直在使用Gtk Entry Completion小部件来显示建议,不仅基于前缀as-you-type,还包括与搜索词匹配的所有子串,但小部件表现不佳,因为它需要前缀匹配(如select用箭头键,显示内联完成等。) 是否有一种简单的方法来支持或需要我创建支持子字符串搜索的其他小部件?
答案 0 :(得分:3)
我认为您正在寻找的是gtk_entry_completion_set_match_func()
。
void gtk_entry_completion_set_match_func (GtkEntryCompletion *completion, GtkEntryCompletionMatchFunc func, gpointer func_data, GDestroyNotify func_notify);
将
completion
的匹配函数设置为func
。比赛 函数用于确定行中是否应该存在行 完成清单。参数
completion
:GtkEntryCompletion- 的GtkEntryCompletionMatchFunc
func
:使用- 的用户数据
func_data
:func
func_notify
:销毁func_data
的通知。
这里,func
是一个布尔函数,如果要显示一行,则返回TRUE
,否则返回FALSE
。
gboolean (*GtkEntryCompletionMatchFunc) (GtkEntryCompletion *completion, const gchar *key, GtkTreeIter *iter, gpointer user_data);
决定
iter
指示的行是否与a匹配的函数 给定key
,并应显示为可能的完成key
。请注意,key
已标准化并且大小写折叠(请参阅g_utf8_normalize()
和g_utf8_casefold()
)。如果不是这样的话 适当的匹配函数可以访问未修改的密钥gtk_entry_get_text (GTK_ENTRY (gtk_entry_completion_get_entry()))
。参数
completion
:GtkEntryCompletionkey
:要匹配的字符串,规范化和大小写折叠iter
:指示要匹配的行的GtkTreeIteruser_data
:提供给gtk_entry_completion_set_match_func()
的用户数据
TRUE
如果iter
应显示为可能的完成情况key
我使用以下简短(写得很差)的代码对此进行了测试:
#include <gtk/gtk.h>
#include <stdlib.h>
gboolean func(GtkEntryCompletion *completion,
const gchar *key,
GtkTreeIter *iter,
gpointer user_data) {
GtkTreeModel *model = gtk_entry_completion_get_model(completion);
gchar *item;
gtk_tree_model_get(model, iter, 0, &item, -1);
gboolean ans = (atoi(key) % 2 == atoi(item) % 2);
g_free(item);
return ans;
}
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget *entry = gtk_entry_new();
GtkEntryCompletion *completion = gtk_entry_completion_new();
GtkListStore *ls = gtk_list_store_new(1, G_TYPE_STRING);
GtkTreeIter iter;
int i;
char buf[20];
for(i=0; i<20; i++) {
gtk_list_store_append(ls, &iter);
sprintf(buf, "%d", i);
gtk_list_store_set(ls, &iter, 0, buf, -1);
}
gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(ls));
gtk_entry_completion_set_match_func(completion, (GtkEntryCompletionMatchFunc)func, NULL, NULL);
gtk_entry_set_completion(GTK_ENTRY(entry), completion);
gtk_entry_completion_set_text_column(completion, 0);
gtk_container_add(GTK_CONTAINER(window), entry);
gtk_widget_show_all(window);
gtk_main();
return 0;
}