Обзор виджетов дерева и списка
Обзор виджетов дерева и списка — Обзор GtkTreeModel, GtkTreeView и других
Обзор
Для создания дерева или списка в GTK+ используйте интерфейс GtkTreeModel в сочетании с виджетом GtkTreeView. Этот виджет разработан с учетом архитектуры Модель/Представление/Контроллер и состоит из четырёх основных частей:
| Виджет представления дерева (GtkTreeView) |
| Столбец представления (GtkTreeViewColumn) |
| Рендереры ячеек (GtkCellRenderer и т.д.) |
| Интерфейс модели (GtkTreeModel) |
Представление состоит из первых трёх объектов, а последний является моделью. Одним из основных преимуществ архитектуры MVC является то, что можно создать несколько представлений для одной модели. Например, для файлового менеджера можно создать модель, отображающую файловую систему. Можно создать множество представлений для отображения различных частей файловой системы, но в памяти нужно хранить только один экземпляр модели.
Цель рендереров ячеек — обеспечить расширяемость виджета и позволить различные способы отображения одного и того же типа данных. Например, рассмотрим, как отобразить булеву переменную. Нужно ли отображать её как строку "Истина" или "Ложь", "Вкл" или "Выкл", или как флажок?
Создание модели
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.24/TreeWidget.html