GTK Entry完成不仅仅是前缀

时间:2015-04-09 16:36:31

标签: gtk3

我一直在使用Gtk Entry Completion小部件来显示建议,不仅基于前缀as-you-type,还包括与搜索词匹配的所有子串,但小部件表现不佳,因为它需要前缀匹配(如select用箭头键,显示内联完成等。) 是否有一种简单的方法来支持或需要我创建支持子字符串搜索的其他小部件?

1 个答案:

答案 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
  •   
  • func:使用
  • 的GtkEntryCompletionMatchFunc   
  • func_datafunc
  • 的用户数据   
  • 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:GtkEntryCompletion
  •   
  • key:要匹配的字符串,规范化和大小写折叠
  •   
  • iter:指示要匹配的行的GtkTreeIter
  •   
  • user_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;
}