Code:
#include <gtk/gtk.h>
#include <string.h>
static GtkTreeModel *create_and_fill_model (void)
{
GtkTreeStore *liststore;
GtkTreeIter toplevel, child;
// Erstelle Liste (2 Spalten, Typ Int, Typ String)
liststore = gtk_tree_store_new(2, G_TYPE_UINT, G_TYPE_STRING);
// Erster Eintrag (Wurzel)
gtk_tree_store_append(liststore, &toplevel, NULL);
gtk_tree_store_set (liststore, &toplevel,
0, 1, // Spalte 1, Wert
1, "Hans", // Spalte 2, Wert
-1); // Ende
gtk_tree_store_append(liststore, &toplevel, NULL);
gtk_tree_store_set (liststore, &toplevel,
0, 2,
1, "Adam",
-1);
gtk_tree_store_append(liststore, &toplevel, NULL);
gtk_tree_store_set (liststore, &toplevel,
0, 3,
1, "Eva",
-1);
gtk_tree_store_append(liststore, &child, &toplevel);
gtk_tree_store_set (liststore, &child,
0, 4,
1, "Knut",
-1);
return GTK_TREE_MODEL(liststore);
}
static GtkWidget *create_view (void)
{
GtkTreeViewColumn *col;
GtkWidget *view;
GtkCellRenderer *renderer;
view = gtk_tree_view_new();
/* Erste Spalte */
col = gtk_tree_view_column_new();
// Spaltenkopfbeschriftung
gtk_tree_view_column_set_title(col, "ID");
// An TreeView anhängen
gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
/* Renderer für erste Spalte */
renderer = gtk_cell_renderer_text_new();
// Packe Renderer in Spalte
gtk_tree_view_column_pack_start(col, renderer, TRUE);
// Setze Eigenschaft 'text' für Renderer
gtk_tree_view_column_add_attribute(col, renderer, "text", 0);
/* Spalte 2 */
col = gtk_tree_view_column_new();
gtk_tree_view_column_set_title(col, "Name");
gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
// -> Hier fehlt der Renderer
// Auswahlmodus des TreeView
gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)),
GTK_SELECTION_NONE);
return view;
}
static GtkWidget *create_combobox(GtkTreeModel *model) {
GtkWidget *combo = gtk_combo_box_new_with_model(model);
GtkCellLayout *layout;
GtkCellRenderer *renderer;
// Übernehme Zellenlayout
layout = GTK_CELL_LAYOUT (combo);
// Neuer Textrenderer
renderer = gtk_cell_renderer_text_new();
// Weise dem Layout den Textrenderer zu
gtk_cell_layout_pack_start (layout, renderer, FALSE);
// Rendere Spalte 1 als Text, wies aussieht kann ComboBox nur eine Spalte darstellen
gtk_cell_layout_set_attributes (layout, renderer, "text", 1, NULL);
return combo;
}
void
combo_has_changed (GtkComboBox *combo,
gpointer user_data)
{
GtkTreeIter selected;
GtkTreeModel *model;
GValue wert;
unsigned int id;
const gchar *text;
// GValue deinitialisieren (mit 0 füllen)
memset(&wert, 0, sizeof(wert));
// Aktiven Eintrag holen
gtk_combo_box_get_active_iter(combo, &selected);
// TreeModel holen
model = gtk_combo_box_get_model (combo);
// Erste Spalte in GValue speichern
gtk_tree_model_get_value (model, &selected, 0, &wert);
// Hole uint ID
id = g_value_get_uint(&wert);
// Vernichten
g_value_unset(&wert);
// Zweite Spalte in GValue speichern
gtk_tree_model_get_value (model, &selected, 1, &wert);
// Hole string Text
text = g_value_get_string(&wert);
g_print("ID: %d - Text: %s\n", id, text);
// Nochmal vernichten
g_value_unset (&wert);
}
int
main (int argc, char **argv)
{
GtkTreeModel *model;
GtkWidget *window, *view, *vbox, *combo;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(window, "delete_event", gtk_main_quit, NULL);
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), vbox);
// Erstelle TreeModel (TreeStore)
model = create_and_fill_model();
// Erstelle ComboBox mit TreeModel
combo = create_combobox(model);
// TreeView
view = create_view();
// Weise Model dem TreeView zu
gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);
g_object_unref(model);
// Aktiviere ersten Eintrag der ComboBox
gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
// Signal fürs Auswählen
g_signal_connect(combo, "changed", G_CALLBACK(combo_has_changed), NULL);
// In VBox packen
gtk_box_pack_start (GTK_BOX (vbox), combo, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (vbox), view, FALSE, FALSE, 0);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
Die einfache Listenversion, findet ihr auf Pronix (wo ich die Frage vorher gestellt hatte).
Lesezeichen