LINUX.ORG.RU

В продолжении gtk+-2.0


0

0

Вот выстрадал такой код:
GtkTreeStore* store = gtk_tree_store_new (1,G_TYPE_STRING);
GtkTreeIter iter;
gtk_tree_store_append (store, &iter, NULL);
gtk_tree_store_set (store,&iter,0,"zzz",-1);
GtkTreeIter child_iter;
gtk_tree_store_append (store, &child_iter, &iter);
gtk_tree_store_set (store,&child_iter,0,"zzz",-1);
GtkTreeIter child_iter1;
gtk_tree_store_append (store, &child_iter1, &child_iter);
gtk_tree_store_set (store,&child_iter1,0,"zzz",-1);
g_print("gtk_tree_view_new_with_model");
treeview1 = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
gtk_widget_show (treeview1);
gtk_container_add (GTK_CONTAINER (scrolledwindow1), treeview1);
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview1), FALSE);
GtkCellRenderer* renderer = gtk_cell_renderer_text_new ();
GtkTreeViewColumn *column= gtk_tree_view_column_new_with_attributes
("Title", renderer, "text", "zzz", NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview1), column);


Но при запуске поля дерева не видны и получаю сооющение
(:25607): Gtk-CRITICAL **: file gtktreestore.c: line 639 (gtk_tree_store_get_value): assertion `column < GTK_TREE_STORE (tree_model)->n_columns' failed
(:25607): GLib-GObject-CRITICAL **: file gobject.c: line 1019 (g_object_set_property): assertion `G_IS_VALUE (value)' failed
Вот че за хрень парюсь уже неделю примеров на эту тему не нашел

anonymous

GtkTreeViewColumn *column= gtk_tree_view_column_new_with_attributes
("Title", renderer, "text", "zzz", NULL); 

Вместо "zzz" нужно указать номер колонки, откуда брать текст. Вот так
Да, и еще, вроде в конце должен -1 стоять. 

GtkTreeViewColumn *column= gtk_tree_view_column_new_with_attributes
("Title", renderer, "text", 0, -1); 

Вообще это принято писать так
enum
{
 COLUMN_TEXT,
 NUM_COLUMNS,
};

store = gtk_tree_store_new (NUM_COLUMNS,G_TYPE_STRING);
..........
gtk_tree_store_set (store,&child_iter,COLUMN_TEXT,"zzz",-1); 
..........
column = gtk_tree_view_column_new_with_attributes
("Title", renderer, "text", COLUMN_TEXT, -1);


Да и еще, объявлять переменные в начале блока - очень хороший стиль программирования. 

А вообще примеры лучше смотреть в исходниках работающих программ -- nautilus, например, и так далее. 

anonymous
()
Ответ на: комментарий от anonymous

Все спасибо заработало...
По ходу дела еще вопрос как повесить на узел данные(указатель) а потом по событию(клику) получить их?
Исходники nautilus получить нет возможности

anonymous
()
Ответ на: комментарий от anonymous

Добавь еще одну колонку с типом gpointer.

enum {
COLUMN_TEXT,
COLUMN_DATA,
NUM_COLUMNS
}

................

При создании модели.
gtk_tree_store_set(store, &iter, COLUMN_TEXT, "zzz", COLUMN_DATA, some_data, -1);

При создании дерева добавь обработчик сигнала.

g_signal_connect(tree_view, "row-activated", row_activated_cb, NULL);

И напиши обрабочик. 
void    row_activated_cb (GtkTreeView *treeview,
                          GtkTreePath *arg1,
                          GtkTreeViewColumn *arg2,
                          gpointer user_data)
{
 gpointer some_data;
 GtkTreeIter iter;
 GtkTreeModel* model;
 
 model = gtk_tree_view_get_model (treeview);
 if (gtk_tree_model_get_path(model, &iter, arg1))
  {
    gtk_tree_model_get(model, &iter, COLUMN_DATA, &some_data, -1);
    display_some_data(data);
  }
}

Исходники все равно читать полезно. 



anonymous
()
Ответ на: комментарий от anonymous

Огромное спасибо уже сам до всего допер но всеравно толчек был от вас...
исходники это сила а вот по GTK мануал скудный да и экзамплов маловато

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.