Обзор виджетов дерева и списка
Обзор виджетов дерева и списка — Обзор GtkTreeModel, GtkTreeView и родственных элементов
Обзор
Для создания дерева или списка в GTK+ используйте интерфейс GtkTreeModel в сочетании с виджетом GtkTreeView. Этот виджет разработан на основе модели Модель/Представление/Контроллер и состоит из четырёх основных частей:
| Виджет представления дерева (GtkTreeView) |
| Столбец представления (GtkTreeViewColumn) |
| Рендереры ячеек (GtkCellRenderer и т. д.) |
| Интерфейс модели (GtkTreeModel) |
Представление состоит из первых трёх объектов, а последний — модель. Одно из главных преимуществ модели MVC заключается в том, что для одной модели можно создать несколько представлений. Например, для файлового менеджера можно создать модель, отображающую файловую систему. Можно создать несколько представлений для отображения различных частей файловой системы, но в памяти будет храниться только один экземпляр.
Цель рендереров ячеек — обеспечить расширяемость виджета и предоставить несколько способов отображения одного и того же типа данных. Например, рассмотрим, как отобразить булеву переменную. Следует ли отобразить её как строку "True" или "False", "Вкл." или "Выкл.", или как флажок?
Создание модели
GTK+ предоставляет две простые модели: GtkListStore и GtkTreeStore. GtkListStore используется для моделирования списков, а GtkTreeStore — для моделирования деревьев. Разработка нового типа модели возможна, но существующие модели должны удовлетворить все потребности, кроме самых специализированных случаев. Создание модели достаточно просто:
Это создаёт хранилище списка с двумя столбцами: строковым столбцом и булевым столбцом. Обычно 2 никогда не передаётся напрямую; обычно создаётся перечисление, в котором перечисляются различные столбцы, а затем маркер, представляющий общее количество столбцов. Следующий пример проиллюстрирует это, используя вместо хранилища списка хранилище дерева.
Создание хранилища дерева работает почти точно так же.
Добавление данных в модель выполняется с помощью gtk_tree_store_set() или gtk_list_store_set(), в зависимости от типа созданной модели. Для этого необходимо получить GtkTreeIter. Итератор указывает на место, где будут добавлены данные.
После получения итератора используется gtk_tree_store_set() для применения данных к части модели, на которую указывает итератор. Рассмотрим следующий пример:
Обратите внимание, что последний аргумент равен -1. Это всегда делается, потому что это функция с переменным числом аргументов, и ей необходимо знать, когда прекратить обработку аргументов. Она может использоваться для установки данных в любой или во всех столбцах заданной строки.
Третий аргумент в gtk_tree_store_append() — это родительский итератор. Он используется для добавления строки в GtkTreeStore в качестве дочерней строки существующей строки. Это означает, что новая строка будет видна только когда её родительская строка видна и в расширенном состоянии. Рассмотрим следующий пример:
Создание компонента представления
Хотя существует несколько разных моделей, есть только один виджет представления. Он работает как с хранилищем списка, так и с хранилищем дерева. Настройка GtkTreeView несложна. Ему необходима GtkTreeModel, чтобы знать, откуда получать данные.
Столбцы и рендереры ячеек
После того, как виджет GtkTreeView получил модель, ему нужно узнать, как отобразить модель. Для этого используются столбцы и рендереры ячеек.
Рендереры ячеек используются для отображения данных из модели дерева определённым образом. GTK+ поставляется с несколькими рендерерами ячеек, включая GtkCellRendererText, GtkCellRendererPixbuf и GtkCellRendererToggle. Написание пользовательского рендерера относительно просто.
GtkTreeViewColumn — это объект, который GtkTreeView использует для организации вертикальных столбцов в представлении дерева. Ему нужно знать имя столбца для маркировки для пользователя, какой тип рендерера ячейки использовать и какой фрагмент данных извлекать из модели для заданной строки.
На этом этапе все шаги по созданию отображаемого дерева пройдены. Модель создана, данные в неё сохранены, создано представление дерева, добавлены столбцы.
Обработка выделения
Большинству приложений потребуется не только обработка отображения данных, но и получение событий ввода от пользователей. Для этого просто получите ссылку на объект выделения и подключитесь к сигналу “changed”.
Затем для извлечения данных выделенной строки:
Простой пример
Вот простой пример использования виджета GtkTreeView в контексте других виджетов. Он просто создаёт простую модель и представление и объединяет их. Обратите внимание, что модель никогда не заполняется данными — это оставлено в качестве упражнения для читателя. Более подробную информацию можно найти в разделе GtkTreeModel.
GtkListStore *store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_BOOLEAN);
© 2005–2020 The GNOME Project
Licensed under the GNU Lesser General Public License version 2.1 or later.
https://developer.gnome.org/gtk3/3.22/TreeWidget.html