2011-12-12 42 views
0
导致

我尝试使用GtktreeView显示MySQL查询的结果下与下面是从GtkEntry中的更改处理要求越来越代码“搜索您的输入”效应:显示Mysql的使用C在Gtktreeview

... 
    result = mysql_store_result(conn); 
if (result) 
{ 
    while ((row = mysql_fetch_row(result))) 
    { 
    gtk_list_store_append(store, &iter); 
    gtk_list_store_set(store, &iter, cID, row[0], 
            cCity, row[1], 
            cState, row[2], 
            cPop, atoi(row[3]), 
            cLast, "", -1); 
    } 
} 
etc... 

问题是,结果可能包含很多数据,对于数千行,而且mysql足够快,那么大量的数据会使GtkTreeView变得不能接受缓慢(比打字更慢并且通常是电脑震动)。当我将LIMIT 20放在查询中时,这段代码工作正常,但只有前20行的匹配数据可以实现。我认为这很慢,因为gtktreeview的所有重绘都是活动的。 在一些工具包中,可以在列表加载时关闭所有刷新,然后在加载完成时显示简单结果。在GtkTreeView中有这种可能吗?

或者我还可以做点别的吗?像把这个函数放在线程中? 还是其他解决方案?

感谢您的高级建议!

+1

为什么不尝试['GtkEntryCompletion'](http://developer.gnome.org/gtk/2.24/GtkEntryCompletion.html)而不是创建自己的TreeView? –

+0

为什么不能?但我从来没有尝试过。你能指出我在类似的情况下使用GtkEntryCompletion的任何基本可行的例子吗? –

回答

1

我不太清楚你的要求是什么。不幸的是,我也没有使用过MySQL的经验。但是关于使用GtkEntryCompletionGtkEntry进行“输入时搜索”效果,您必须创建GtkEntryCompletion并将其设置为GtkEntry。然后,您可以设置一个模型来完成从中选择完成数据的入口。这是基于GTK的演示源& coding.debuntu.org代码示例代码:

#include <gtk/gtk.h> 
#include <string.h> 

static gboolean 
on_match_select(GtkEntryCompletion *widget, GtkTreeModel *model,GtkTreeIter *iter, gpointer user_data) 
{ 
    GValue value = {0, }; 
    GValue id = {0, }; 
    gtk_tree_model_get_value(model, iter, 1, &value); 
    gtk_tree_model_get_value(model, iter, 0, &id); 
    fprintf(stdout, "You have selected value=\"%s\" with id = %d\n", 
     g_value_get_string(&value), 
     g_value_get_int(&id)); 
    g_value_unset(&value); 
    g_value_unset(&id); 

    return FALSE; 
} 

/* Creates a tree model containing the completions */ 
static GtkTreeModel * 
create_completion_model (void) 
{ 
    GtkListStore *store; 
    GtkTreeIter iter; 
    int id = 0; 
    char buffer[1024]={0,}; 

    store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING); 

    /* Here we add the data to be shown for completion */ 
    /* Add 10000 strings */ 
    for(id = 0; id < 10000; id++) 
    { 
     if(id%2) 
      snprintf(buffer, sizeof buffer -1, "homer #%d with %d", id/2, id); 
     else 
      snprintf(buffer, sizeof buffer -1, "marge #%d with %d", id/2, id); 

     gtk_list_store_append (store, &iter); 
     gtk_list_store_set (store, &iter, 0, id, 1, buffer, -1); 
    } 
    return GTK_TREE_MODEL (store); 
} 


int main (void) 
{ 
    GtkWidget *window; 
    GtkWidget *vbox; 
    GtkWidget *label; 
    GtkWidget *entry; 
    GtkEntryCompletion *completion; 
    GtkTreeModel *completion_model; 

    gtk_init (NULL, NULL); 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title(GTK_WINDOW(window),"Sample entry completion"); 
    g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL); 

    vbox = gtk_vbox_new (FALSE, 5); 
    gtk_container_set_border_width (GTK_CONTAINER (window), 5); 
    gtk_container_add(GTK_CONTAINER(window), vbox); 

    label = gtk_label_new (NULL); 
    gtk_label_set_markup (GTK_LABEL (label), 
         "Completion demo, try writing <b>homer/marge #...</b>; replace ... by a number b/w 0 &amp; 9999."); 

    gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); 

    /* Create our entry */ 
    entry = gtk_entry_new(); 
    gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0); 

    /* Create the completion object */ 
    completion = gtk_entry_completion_new(); 

    /* Assign the completion to the entry */ 
    gtk_entry_set_completion (GTK_ENTRY (entry), completion); 
    g_object_unref (completion); 

    /* Create a tree model and use it as the completion model */ 
    completion_model = create_completion_model(); 
    gtk_entry_completion_set_model (completion, completion_model); 
    /* Connect callback for match selection */ 
    g_signal_connect(G_OBJECT (completion), "match-selected", G_CALLBACK (on_match_select), NULL); 
    g_object_unref (completion_model); 

    /* Use model column 1 (i.e. 2nd column) as the text column */ 
    /* Model currently used has int (id) in 1st column & string (data) in 2nd column */ 
    gtk_entry_completion_set_text_column (completion, 1); 

    gtk_widget_show_all (window); 
    gtk_main(); 

    return 0; 
} 

希望这是一个有点比你目前的方法更快。
希望这有助于!

+0

这里是mysql只是数据源(比如for循环),所以这个例子非常有用,谢谢。由于创建模型而不立即显示数据,速度更快。在我的情况下,它不完全适用,因为它只从开始搜索,但对某些选项肯定有用。无论如何,在这里可以下载这样的Gtk2例子吗? –

+0

另外,我在搜索中发现了入口完成的有趣用法,但是我无法强制将匹配的建议列表强制打开到UP(over)dirrection。这可能吗? –

+0

@ user973238:对不起,我不明白。你的意思是完成下拉列表显示在你的条目上方? –