2011-12-12 37 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:對不起,我不明白。你的意思是完成下拉列表顯示在你的條目上方? –