GtkTreeIter iter;
gtk_tree_store_append(store, &iter, NULL);
Получив итератор, вы можете заполнять строку с помощью функции gtk_tree_store_set:
gtk_tree_store_set(store, &iter,
0, "Def Leppard",
1, 1987,
2, TRUE, -1);
Номер столбца и данные передаются парами, которые завершаются -1. Позже вы примените тип enum для того, чтобы сделать номера столбцов более информативными.
Для того чтобы добавить ветвь к данной строке (дочернюю строку), вам нужен только итератор для дочерней строки, который вы получаете, вызвав снова функцию gtk_tree_store_appendи указав на этот раз в качестве параметра строку верхнего уровня:
GtkTreeIter child;
gtk_tree_store_append(store, &child, &iter);
Дополнительную информацию об объектах GtkTreeStoreи функциях объекта GtkListStoreсм. в документации API, а мы пойдем дальше и рассмотрим компонент Представление типа GtkTreeView.
Создание объекта GtkTreeView— сама простота: только передайте в конструктор в качестве параметра модель типа GtkTreeStoreили GtkListStore:
GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
Сейчас самое время настроить виджет для отображения данных именно так, как вы хотите. Для каждого столбца следует определить GtkCellRendererи источник данных. Можно выбрать, например, визуализацию только определенных столбцов данных или изменить порядок вывода столбцов.
GtkCellRenderer— это объект, отвечающий за прорисовку каждой ячейки на экране, и существует три подкласса, имеющие дело с текстовыми ячейками, ячейками пиксельной графики и ячейками кнопок-выключателей:
□ GtkCellRendererText;
□ GtkCellRendererPixBuf;
□ GtkCellRendererToggle.
В вашем Представлении будет применено текстовое представление ячеек, GtkCellRendererText.
GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
"This is the column title", renderer, "text", 0, NULL);
Вы создаете представление ячейки и передаете его в функцию вставки столбца. Эта функция позволяет сразу задать свойства GtkCellRendererText, передавая заканчивающиеся значением NULLпары "ключ/значение". В качестве параметров указаны представление дерева, номер столбца, заголовок столбца, представление ячейки и его свойства. В приведенном примере вы задаете атрибут "text", передав номер столбца источника данных. Для объекта GtkCellRendererTextопределено несколько других атрибутов, включая подчеркивание, шрифт, размер и т.д.
В упражнении 16.7, выполнив необходимые шаги, вы увидите, как это работает на практике.
Упражнение 16.7. Использование виджета GtkTreeView
Введите следующий программный код и назовите файл tree.с.
1. Примените тип enumдля обозначения столбцов, чтобы можно было ссылаться на них по именам. Общее количество столбцов удобно обозначить как N_COLUMNS:
#include
enum {
COLUMN_TITLE, COLUMN_ARTIST, COLUMN_CATALOGUE, N_COLUMNS
};
void closeApp(GtkWidget *window, gpointer data) {
gtk_main_quit();
}
int main(int argc, char *argv[]) {
GtkWidget *window;
GtkTreeStore *store;
GtkWidget *view;
GtkTreeIter parent_iter, child_iter;
GtkCellRenderer *renderer;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
g_signal_connect(GTK_OBJECT(window), "destroy",
GTK_SIGNAL_FUNC(сloseApp), NULL);
2. Далее вы создаете модель дерева, передавая количество столбцов и тип каждого из них:
store = gtk_tree_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING);
3. Следующий этап — вставка родительской и дочерней строк в дерево:
gtk_tree_store_append(store, &parent_iter, NULL);
gtk_tree_store_set(store, &parent_iter,
COLUMN_TITLE, "Dark Side of the Moon",
COLUMN_ARTIST, "Pink Floyd",
COLUMN_CATALOGUE, "B000024D4P", -1);
gtk_tree_store_append(store, &child_iter, &parent_iter);
gtk_tree_store_set (store, &child_iter,
COLUMN_TITLE, "Speak to Me", -1);
view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
4. Наконец, добавьте столбцы в представление, задавая источники данных для них и заголовки:
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
COLUMN_TITLE, "Title", renderer, "text",
COLUMN_TITLE, NULL);
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
COLUMN_ARTIST, "Artist", renderer, "text",
COLUMN_ARTIST, NULL);
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
COLUMN_CATALOGUE, "Catalogue", renderer, "text",
COLUMN_CATALOGUE, NULL);
gtk_container_add(GTK_CONTAINER(window), view);
gtk_widget_show_all(window); gtk_main();
return 0;
}
Вы будете применять GtkTreeViewкак основной объект вашего приложения для работы с компакт-дисками, когда будете модифицировать содержимое GtkTreeViewв соответствии с запросами к базе данных компакт-дисков.
Читать дальше