редактирование и удаление данных из модели выполняется с помощью структур
GtkTreeIter
. Эти структуры итераторов указывают на узлы дерева (или строки списка) и помогают находить фрагменты структур данных потенциально очень большого объема, а также манипулировать ими. Есть несколько вызовов API для получения объекта-итератора для разных точек дерева, но мы рассмотрим простейшую функцию
gtk_tree_store_append
.
Перед тем как вставлять какие-либо данные в модель дерева, вам нужно получить итератор, указывающий на новую строку. Функция
gtk_tree_store_append
заполняет объект
GtkTreeIter
, который представляет новую строку в дереве, как строку верхнего уровня (если вы передаете значение
NULL
в третьем аргументе), так и подчиненную или дочернюю строку (если вы передаете итератор главной или родительской строки):
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
— сама простота: только передайте в конструктор в качестве параметра модель типа
Сейчас самое время настроить виджет для отображения данных именно так, как вы хотите. Для каждого столбца следует определить
GtkCellRenderer
и источник данных. Можно выбрать, например, визуализацию только определенных столбцов данных или изменить порядок вывода столбцов.
GtkCellRenderer
— это объект, отвечающий за прорисовку каждой
ячейки на экране, и существует три подкласса, имеющие дело с текстовыми ячейками, ячейками пиксельной графики и ячейками кнопок-выключателей:
GtkCellRendererText
;
GtkCellRendererPixBuf
;
GtkCellRendererToggle
.
В вашем Представлении будет применено текстовое представление ячеек,
"This is the column title", renderer, "text", 0, NULL);
Вы создаете представление ячейки и передаете его в функцию вставки столбца. Эта функция позволяет сразу задать свойства
GtkCellRendererText
, передавая заканчивающиеся значением
NULL
пары "ключ/значение". В качестве параметров указаны представление дерева, номер столбца, заголовок столбца, представление ячейки и его свойства. В приведенном примере вы задаете атрибут "text", передав номер столбца источника данных. Для объекта
GtkCellRendererText
определено несколько других атрибутов, включая подчеркивание, шрифт, размер и т.д.
В упражнении 16.7, выполнив необходимые шаги, вы увидите, как это работает на практике.
Упражнение 16.7. Использование виджета
GtkTreeView
Введите следующий программный код и назовите файл tree.с.
1. Примените тип
enum
для обозначения столбцов, чтобы можно было ссылаться на них по именам. Общее количество столбцов удобно обозначить как