[GTK] Scrolled List - Einträge bearbeiten (hinzufügen, löschen)
-
Hallo!
Habe hier lauffähigen Code (so soll mein fertiges GUI aussehen, hab das ganze mit Hilfe der Tutorials zusammengestöpselt). Leider habe ich keine Plan was es mit dieser Liste auf sich hat, bzw wie das ganze funktioniert. Also in das Scrollable Window werden 20 Eintrage geschrieben, das habe ich mal verstanden, den Weg dorthin finde ich etwas kompliziert. Werden eigentlich die Daten auch irgendwo gespeichert. Wie kann ich da zum Beispiel Daten hinzufügen bzw löschen (z.b. mit dem drücken des Buttons). Nach der Beendigung der Funktion create_list ist ja alles weg bis auf das scrolled_window -> sind da auch die Daten drinnen? Verstehe einfach nicht warum ich das alles:
GtkWidget *scrolled_window; GtkWidget *tree_view; GtkListStore *model; GtkTreeIter iter; GtkCellRenderer *cell; GtkTreeViewColumn *column;
brauche für so eine einfache Liste, nach Beendigung der creat_list Funktion ist ja sowieso alles andere weg, oder?? Vielleicht kann mir ja jemand erklären wie das alles zusammenhängt, und hat vielleicht Ideen für Funktionen wie hinzufügen, einfügen, anfügen von neuen Einträgen , bestimmte Elemente löschen, etc.. ! Vielleicht hat ja jemand schon mal sowas ähnliches gemacht und kann mir zeigen wie ein hinzufügen Funktion aussehen muss.
Mit bestem Dank im voraus THE_ONE
Ps.: kann man es, hier im Forum, eigentlich irgendwie bewerkstelligen das man den Sourcode ausklappen kann. Gibts das schon, wenn ned wäre doch eine Super Idee , dann müsste man nicht soviel scrollen bei längeren Sourcecodes
/*run with: gcc filename.c -o filname `pkg-config --cflags --libs gtk+-2.0` */ #include <stdio.h> #include <gtk/gtk.h> /* Create the list of "messages" */ static GtkWidget *create_list( void ) { GtkWidget *scrolled_window; GtkWidget *tree_view; GtkListStore *model; GtkTreeIter iter; GtkCellRenderer *cell; GtkTreeViewColumn *column; int i; /* Create a new scrolled window, with scrollbars only if needed */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); model = gtk_list_store_new (1, G_TYPE_STRING); tree_view = gtk_tree_view_new (); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), tree_view); gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), GTK_TREE_MODEL (model)); gtk_widget_show (tree_view); /* Add some messages to the window */ for (i = 0; i < 20; i++) { gchar *msg = g_strdup_printf ("Message #%d", i); gtk_list_store_append (GTK_LIST_STORE (model), &iter); gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, msg, -1); g_free (msg); } cell = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("Messages", cell, "text", 0, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), GTK_TREE_VIEW_COLUMN (column)); return scrolled_window; } int main( int argc, char *argv[] ) { GtkWidget *window; GtkWidget *list; GtkWidget *box1h; GtkWidget *box2h; GtkWidget *box1v; GtkWidget *button; GtkWidget *separator; GtkWidget *layout1; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Scanner"); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); gtk_container_set_border_width (GTK_CONTAINER (window), 10); gtk_widget_set_size_request (GTK_WIDGET (window), 450, 400); /* We create a vertical box (vbox) to pack the horizontal boxes into. * This allows us to stack the horizontal boxes filled with buttons one * on top of the other in this vbox. */ box1v = gtk_vbox_new (FALSE, 0); /* Create a new hbox.. remember we can use as many as we need! */ box1h = gtk_hbox_new (FALSE, 0); /* Create a new hbox.. remember we can use as many as we need! */ box2h = gtk_hbox_new (FALSE, 0); /* Connect button. */ button = gtk_button_new_with_label ("Connect"); /* Setup the signal to terminate the program when the button is clicked */ g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_main_quit), G_OBJECT (window)); list = create_list (); /* A separator for the bottom. */ separator = gtk_hseparator_new (); /* This explicitly sets the separator to 400 pixels wide by 5 pixels * high. This is so the hbox we created will also be 400 pixels wide, * and the "end" label will be separated from the other labels in the * hbox. Otherwise, all the widgets in the hbox would be packed as * close together as possible. */ gtk_widget_set_size_request (separator, 400, 5); /* pack the separator into the vbox (box1) created near the start * of main() */ /* Pack the button into the box1h.*/ gtk_widget_set_size_request (list, 400, 320); gtk_box_pack_start (GTK_BOX (box1v), list, TRUE, FALSE, 0); gtk_widget_show (list); gtk_box_pack_start (GTK_BOX (box1v), separator, FALSE, TRUE, 5); gtk_widget_show (separator); /* Pack the button into the box2h. * The last 3 arguments to gtk_box_pack_start are: * expand, fill, padding. */ gtk_box_pack_start (GTK_BOX (box2h), button, TRUE, FALSE, 0); gtk_widget_show (button); /* pack the box2h into the vbox (box1v) */ gtk_box_pack_start (GTK_BOX (box1v), box2h, FALSE, FALSE, 0); gtk_widget_show (box2h); /* Pack the vbox (box1v) which now contains all our widgets, into the * main window. */ gtk_container_add (GTK_CONTAINER (window), box1v); gtk_widget_show (box1v); gtk_widget_show (window); gtk_main (); return 0; }
-
THE_ONE schrieb:
Leider habe ich keine Plan was es mit dieser Liste auf sich hat, bzw wie das ganze funktioniert.
Das ist nicht gut, aber ist auch ziemlich schwer, das TreeView in GTK+. Schau dir folgendes Tutorials an:
http://scentric.net/tutorial/treeview-tutorial.htmlAlso in das Scrollable Window werden 20 Eintrage geschrieben, das habe ich mal verstanden, den Weg dorthin finde ich etwas kompliziert. Werden eigentlich die Daten auch irgendwo gespeichert.
In deinem Model, in deinem Fall das GtkListStore. http://de.wikipedia.org/wiki/MVC
Wie kann ich da zum Beispiel Daten hinzufügen bzw löschen (z.b. mit dem drücken des Buttons).
http://scentric.net/tutorial/sec-treemodel-add-rows.html
Nach der Beendigung der Funktion create_list ist ja alles weg bis auf das scrolled_window -> sind da auch die Daten drinnen?
Nach dem beenden der Funktion sind die anderen Objekte nicht weg. Du hast nur die Zeiger nicht mehr, aber sie werden jetzt von den einzelnen Klassen verwaltet, an denen du die Zeiger übergibst.
GtkWidget *scrolled_window; // Scrollbars an den Seiten GtkWidget *tree_view; // Widget, dass die Daten anzeigt GtkListStore *model; // Klasse, die die Daten speichert GtkTreeIter iter; // Iterator mit dem du durch die Einträge gehen kannst GtkCellRenderer *cell; // Klasse, die bestimmt wie die "Daten" gezeichnet werden GtkTreeViewColumn *column; // Eine Spalte in deinem TreeView
Das ganz wirkt zwar erst ziemlich kompliziert, doch es ist sehr mächtig und praktisch wenn man es erstmal durchschaut hat.
-
joomoo schrieb:
Nach der Beendigung der Funktion create_list ist ja alles weg bis auf das scrolled_window -> sind da auch die Daten drinnen?
Nach dem beenden der Funktion sind die anderen Objekte nicht weg. Du hast nur die Zeiger nicht mehr, aber sie werden jetzt von den einzelnen Klassen verwaltet, an denen du die Zeiger übergibst.
Wie komme ich an die wieder ran. Verstehe trotzdem nicht warum die Sachen erhalten bleiben. Weil alles was in einer Funktion lokal angelegt wird ist nach Beendigung dieser wieder weg. Funktionslokale Variablen sind ja im Main nicht sichtbar als für mich futsch, will ich aber etwas zur Liste hinzufügen muss ich ja wieder an die Daten kommen.
Ist das ganze nicht das selbe wie hier im Beispiel, nach Beendigung der Funktion ist der Wert von a Weg, daher funktioniert das ganze ja nicht. So wie eben in meinem Fall wo es auch nicht funktioniert
#include <stdio.h> #include <stdlib.h> #include <string.h> int * erzeuge() { int * b; int a=12; b= &a; return b; } int main() { int *a; a=erzeuge; printf("Erzeugter Wertp:%d\n",*a); return EXIT_SUCCESS; }
MFG THE_ONE
-
THE_ONE schrieb:
joomoo schrieb:
Nach der Beendigung der Funktion create_list ist ja alles weg bis auf das scrolled_window -> sind da auch die Daten drinnen?
Nach dem beenden der Funktion sind die anderen Objekte nicht weg. Du hast nur die Zeiger nicht mehr, aber sie werden jetzt von den einzelnen Klassen verwaltet, an denen du die Zeiger übergibst.
Wie komme ich an die wieder ran. Verstehe trotzdem nicht warum die Sachen erhalten bleiben. Weil alles was in einer Funktion lokal angelegt wird ist nach Beendigung dieser wieder weg. Funktionslokale Variablen sind ja im Main nicht sichtbar als für mich futsch, will ich aber etwas zur Liste hinzufügen muss ich ja wieder an die Daten kommen.
Ist das ganze nicht das selbe wie hier im Beispiel, nach Beendigung der Funktion ist der Wert von a Weg, daher funktioniert das ganze ja nicht. So wie eben in meinem Fall wo es auch nicht funktioniert
#include <stdio.h> #include <stdlib.h> #include <string.h> int * erzeuge() { int * b; int a=12; b= &a; return b; } int main() { int *a; a=erzeuge; printf("Erzeugter Wertp:%d\n",*a); return EXIT_SUCCESS; }
MFG THE_ONE
Du legst ja nur Zeiger an. Diese werden dann natürlich zerstört, nicht aber das warauf sie zeigen. Die Objekte werden nämlich auf dem Heap erstellt, kennt man in C durch die FUnktion malloc: http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_016_000.htm#Xxx999328