2017-07-29 2 views
1

Ich hoffe, dass es dir gut geht.Wie können Daten aus einer SQLite-Datenbank in einem GTK TreeView angezeigt werden?

Wie im Titel erwähnt meine Frage ist: Wie Daten aus einer SQLite-Datenbank in eine GTK + 3.0 TreeView mit C-Sprache anzuzeigen?

Ich habe zwei Probleme, das zu tun:

1) Wie richtig das TreeView entwerfen 3 unter Verwendung von Glade, um es wie ein Tisch aussehen zu lassen?

2) Wie man Daten anzeigt, die von einer SQLite in diese TreeView empfangen werden.

Vielen Dank im Voraus.

+0

Sie etwas versuchen, nicht wahr? Gibt es einen Code? Bezüglich SQLite planen Sie die Verwendung von sqlite3 api oder libgda? Außerdem hat Glade 3 ein Problem beim Einrichten der CellRenderer, so dass Sie nicht in der Lage sein werden, alles innerhalb Glade zu tun. –

+0

Ich benutze sqlit3 Bibliothek, Zur Zeit ist die Verbindung zur SQLite-Datenbank in Ordnung, ich bin auch in der Lage, das Ergebnis der SQL-Abfrage zu bekommen. Codes funktionieren perfekt. Es scheint, dass mein wirkliches Problem jetzt ist, wie man GtkTreeView manipulieren kann, es ist ein bisschen schwierig. –

+0

Können Sie etwas Code posten? GtkTreeview folgt dem MVC-Muster (Model-View-Controller). Sie müssen also ein Modell mit Ihren Daten erstellen (Ergebnis aus der SQL-Abfrage) und beim Einstellen der Ansicht (GtkTreeView) ordnen Sie die TreeViewColumns der entsprechenden Spalte im Modell zu (TreeModel - ListStore/TreeStore). –

Antwort

0

In Abwesenheit von Code, ‚ich ein kleines Beispiel mit Dummy-Daten zeigt ll:

#include <sqlite3.h> 
#include <gtk/gtk.h> 
#include <stdio.h> 


int callback(void *, int, char **, char **); 


enum { 
    LIST_ID, 
    LIST_BRAND, 
    LIST_PRICE, 
    N_COLUMNS 
}; 


int main(int argc, char** argv) { 
    GtkCellRenderer *renderer; 
    GtkTreeViewColumn *column; 
    GtkListStore *store; 
    GtkWidget *window; 
    GtkWidget *list; 

    GtkWidget *vbox; 
    GtkWidget *label; 
    GtkTreeSelection *selection; 

    gtk_init(&argc, &argv); 


    // THIS IS THE MODEL: 3 Columns of Type String 

    store = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); 

    // CREATE A SQLITE FILE WITH TABLE CARS AND POPULATE WITH DATA 

    sqlite3 *db; 
    char *err_msg = 0; 

    int rc = sqlite3_open("test.db", &db); 

    if (rc != SQLITE_OK) { 

     fprintf(stderr, "Cannot open database: %s\n", 
       sqlite3_errmsg(db)); 
     sqlite3_close(db); 

     return 1; 
    } 

    char *sql = "DROP TABLE IF EXISTS Cars;" 
       "CREATE TABLE Cars(Id INT, Name TEXT, Price INT);" 
       "INSERT INTO Cars VALUES(1, 'Audi', 52642);" 
       "INSERT INTO Cars VALUES(2, 'Mercedes', 57127);" 
       "INSERT INTO Cars VALUES(3, 'Skoda', 9000);" 
       "INSERT INTO Cars VALUES(4, 'Volvo', 29000);" 
       "INSERT INTO Cars VALUES(5, 'Bentley', 350000);" 
       "INSERT INTO Cars VALUES(6, 'Citroen', 21000);" 
       "INSERT INTO Cars VALUES(7, 'Hummer', 41400);" 
       "INSERT INTO Cars VALUES(8, 'Volkswagen', 21600);"; 

    rc = sqlite3_exec(db, sql, 0, 0, &err_msg); 

    sql = "SELECT * FROM Cars"; 

    rc = sqlite3_exec(db, sql, callback, store, &err_msg); 

    if (rc != SQLITE_OK) { 

     fprintf(stderr, "Failed to select data\n"); 
     fprintf(stderr, "SQL error: %s\n", err_msg); 

     sqlite3_free(err_msg); 
     sqlite3_close(db); 

     return 1; 
    } 

    sqlite3_close(db); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    list = gtk_tree_view_new(); 

    // CREATE 3 COLUMNS WITH TEXT CELL RENDERERS 

    renderer = gtk_cell_renderer_text_new(); 
    column = gtk_tree_view_column_new_with_attributes("ID", 
      renderer, "text", LIST_ID, NULL); 
    gtk_tree_view_append_column(GTK_TREE_VIEW(list), column); 

    renderer = gtk_cell_renderer_text_new(); 
    column = gtk_tree_view_column_new_with_attributes("BRAND", 
      renderer, "text", LIST_BRAND, NULL); 
    gtk_tree_view_append_column(GTK_TREE_VIEW(list), column); 

    renderer = gtk_cell_renderer_text_new(); 
    column = gtk_tree_view_column_new_with_attributes("PRICE", 
      renderer, "text", LIST_PRICE, NULL); 
    gtk_tree_view_append_column(GTK_TREE_VIEW(list), column); 


    // SET THE TREE VIEW MODEL 
    gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store)); 

    // TREEVIEW WILL KEEP A REFERENCE SO DECREASE REFCOUNT 
    g_object_unref(store); 

    // SETUP THE UI 
    gtk_window_set_title(GTK_WINDOW(window), "List view"); 
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 
    gtk_container_set_border_width(GTK_CONTAINER(window), 10); 
    gtk_window_set_default_size(GTK_WINDOW(window), 270, 250); 

    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), FALSE); 

    vbox = gtk_vbox_new(FALSE, 0); 

    gtk_box_pack_start(GTK_BOX(vbox), list, TRUE, TRUE, 5); 

    label = gtk_label_new(""); 
    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5); 

    gtk_container_add(GTK_CONTAINER(window), vbox); 

    g_signal_connect(G_OBJECT (window), "destroy", 
     G_CALLBACK(gtk_main_quit), NULL); 

    gtk_widget_show_all(window); 

    gtk_main(); 

    return 0; 
} 

int callback(void *model, int argc, char **argv, char **azColName) { 
    GtkTreeIter iter; 

    for (int i = 0; i < argc; i++) { 

     printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); 

    } 

    printf("\n"); 

    // AFTER PRINTING TO CONSOLE FILL THE MODEL WITH THE DATA 

    gtk_list_store_append (GTK_LIST_STORE(model), &iter); 
    gtk_list_store_set (GTK_LIST_STORE(model), &iter, LIST_ID, argv[0], 
     LIST_BRAND, argv[1], 
     LIST_PRICE, argv[2], 
     -1); 

    return 0; 
} 

Dieses Beispiel verwendet GLADE nicht, weil es ein Fehler ist, wenn die Einrichtung Zelle Renderer versuchen. Es ist möglich, die Strukturansicht und die Spalten zu erstellen, aber die CellRenderer müssen programmgesteuert ausgeführt werden.

Der wichtigste Teil ist der sqlite3 Callback, der das GtkTreeModel/GtkListStore als erstes Argument verwendet, das dann mit Daten gefüllt wird, aka gefüllt.

Das Modell wird dann als TreeView-Modell festgelegt und die Baumansicht zeigt die Abfragedaten an.

Ich hoffe, es hilft.

PS: Kompilieren mit:

cc -o sqlview sqlview.c -lsqlite3 `pkg-config --cflags --libs gtk+-3.0` 

Ergebnis:

enter image description here

+0

Vielen Dank das Beispiel ist sehr hilfreich. Aber ich frage mich, warum es schwierig ist, das in C und GTK zu tun, ich meine für C++, Qt haben ein bereites DataGrid, das sehr einfach zu manipulieren ist, für Visual Studio hatte auch ein DataGrid. Es scheint, dass GTK veraltet ist ... –

+0

Deshalb habe ich nach [libgda] (https://developer.gnome.org/libgda/stable/) gefragt (hat ein GdaDataModel). Viel Glück –

Verwandte Themen