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:
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. –
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. –
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). –