Spec-Zone.ru › GTK 3.20

Обзор виджетов дерева и списка

Обзор виджетов дерева и списка — Обзор 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.20/TreeWidget.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API