2017-06-07 12 views
0

私はGUI開発で新しく、いくつかの日にgtk + 3のプロジェクトに取り組んできましたが、この時点で固まっています。ツリービューのデータを更新/更新することは可能ですか?

私のアプリには2つのツリービューがあり、行のデータはSQLクエリから取得され、行を右クリックするとポップアップメニューが表示され、データを「既知」に設定するオプションが与えられ、データベーステーブルが更新されます。

これまでのデータは別のツリービューに属している必要があります。そのため、アプリが再起動されたときに実行されますが、リアルタイムで実行するようにしています。

ツリービューのデータを更新/更新することはできますか?

モデルが機能して得られる:

static GtkTreeStore* create_and_fill(char* known) 
{ 
    GtkTreeStore* store; 
    GtkTreeIter iter; 
    GtkWidget* tree; 
    store = gtk_tree_store_new(2,G_TYPE_STRING,G_TYPE_STRING); 

    char source_mac[50] = {0}; 
    char source_ip[50] = {0}; 
    int num_fields; 

    char query[300] = {0}; 
    sprintf(query, "select mac,ip from hosts where known=%s", known); 
    if(mysql_query(conn, query)) 
    { 
    fprintf(stderr,"%s\n", mysql_error(conn)); 
    } 
    res = mysql_store_result(conn); 
    num_fields = mysql_num_fields(res); 

    while((row = mysql_fetch_row(res))) 
    { 
    sprintf(source_mac,"%s", row[0]); 
    sprintf(source_ip,"%s", row[1]); 
    gtk_tree_store_append(store, &iter, NULL); 
    gtk_tree_store_set(store, &iter, MAC_ADDRESS, source_mac, IP_ADDRESS, source_ip,-1); 
    } 
    gtk_tree_store_append(store, &iter, NULL); 
    mysql_free_result(res); 
    return store; 
} 
+0

このトピックについて現在お試しください。これまでに何を試みましたか?データを格納するために使用されるモデル。 – Gerhardh

答えて

0

は私がgtk_tree_storeを使用したことがないが、唯一のgtk_list_store。それにもかかわらず、ロジックはgtk_tree_storeにも適用されるはずです。

新しいSQLクエリの結果によっては、一部のエントリが変更、追加または削除される可能性があります。

ビューを更新する基本的な2つの方法があります。

テーブルで行を追加したり削除したりする場合は、ツリー全体をクリーンアップしてもう一度入力するのが最も簡単な方法です。

GtkTreeIter  iter; 
gboolean   iter_valid; 

iter_valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter); 
while (iter_valid) 
{ 
    // Maybe additional cleanup of related data 
    // gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, .... -1); 
    iter_valid = gtk_tree_store_remove(store, &iter); 
} 
// Maybe update filtering and sorting afterwards 
gtk_tree_model_filter_refilter(store_filtered); 

// Populate again with result of SQL query. 

あなたは、あなただけのストレージにそれを変更することができる唯一のコンテンツの変更ことを確認することができます場合は、次の

GtkTreeIter  iter; 
gboolean   iter_valid; 

iter_valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter); 
while (iter_valid) 
{ 
    gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, < add fields here >, -1); 

    bool   update = FALSE; 
    // Check if this entry needs to be updated 
    // .... => set update = TRUE; 

    if (update) 
    gtk_tree_store_set(store, &iter, < field names and values here... > -1); 

    iter_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter); 
} 
// Optionally update filtering and sorting... 
+0

私は入力を感謝します。 – Vanreyn

0

私は単に醜いパッチをやってしまいました。 ツリービューを削除し、ストアを再構築して、それらを再度パックする関数を作成しました。

static void refresh() 
{ 
gtk_container_remove(GTK_CONTAINER(box), tree_1); 
gtk_container_remove(GTK_CONTAINER(box), tree_2); 

tree_1 = create_view(create_and_fill("true")); // Rebuild the stores and views 
tree_2 = create_view(create_and_fill("false")); 

gtk_box_pack_start(GTK_BOX(box),tree_1,FALSE,FALSE,0); 
gtk_box_pack_start(GTK_BOX(box),tree_2,FALSE,FALSE,0); 

gtk_box_reorder_child(GTK_BOX(box), tree_1, x); // X being the relative position of your treeview 
gtk_box_reorder_child(GTK_BOX(box), tree_2, x); 
gtk_widget_show_all(box); 
} 
関連する問題