2017-06-07 3 views
0

Ich bin neu in der GUI Entwicklung und arbeite seit einigen Tagen an einem Projekt mit gtk + 3, aber ich stecke an diesem Punkt fest.Ist es möglich, die Daten in einer Baumansicht zu aktualisieren/aktualisieren?

Meine App enthält zwei TreeViews, die Daten in den Zeilen stammen aus einer SQL-Abfrage, durch Rechtsklick auf eine Zeile erscheint ein Popup-Menü mit der Option, die Daten als "bekannt" zu setzen und die Datenbanktabelle zu aktualisieren .

Die vorherigen Daten sollten jetzt in die andere Baumansicht gehören, und so wird es gemacht, wenn die App neu gestartet wird, aber ich versuche es in Echtzeit zu tun.

Ist es möglich, die Daten in einer Baumansicht zu aktualisieren/zu aktualisieren?

Das Modell wird mit der Funktion erhalten:

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

Bitte zeigen Sie uns Ihre aktuellen Bemühungen zu diesem Thema. Was hast du bisher versucht? Welches Modell wird zum Speichern der Daten verwendet? – Gerhardh

Antwort

0

Ich habe selber nie gtk_tree_store, aber nur gtk_list_store. Trotzdem sollte die Logik auch für gtk_tree_store gelten.

Abhängig vom Ergebnis einer neuen SQL-Abfrage können einige Einträge geändert, hinzugefügt oder gelöscht werden.

Es gibt grundsätzlich 2 Möglichkeiten, Ihre Ansicht zu aktualisieren.

Wenn Zeilen in Ihrer Tabelle hinzugefügt und entfernt werden, besteht die einfachste Möglichkeit darin, den gesamten Baum zu bereinigen und erneut aufzufüllen.

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. 

Wenn Sie sicher sein, dass nur der Inhalt ändert, dann könnte man es nur im Speicher ändern:

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

Ich schätze die Eingabe. – Vanreyn

0

landete ich einfach auf eine hässliche Flecken zu tun. Ich habe eine Funktion erstellt, die die Baumansichten entfernt, die Speicher neu erstellt und sie erneut packt.

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); 
} 
Verwandte Themen