GtkListStore
GtkListStore — Структура данных, похожая на список, которая может использоваться с GtkTreeView
Функции
| GtkListStore * | gtk_list_store_new () |
| GtkListStore * | gtk_list_store_newv () |
| void | gtk_list_store_set_column_types () |
| void | gtk_list_store_set () |
| void | gtk_list_store_set_valist () |
| void | gtk_list_store_set_value () |
| void | gtk_list_store_set_valuesv () |
| gboolean | gtk_list_store_remove () |
| void | gtk_list_store_insert () |
| void | gtk_list_store_insert_before () |
| void | gtk_list_store_insert_after () |
| void | gtk_list_store_insert_with_values () |
| void | gtk_list_store_insert_with_valuesv () |
| void | gtk_list_store_prepend () |
| void | gtk_list_store_append () |
| void | gtk_list_store_clear () |
| gboolean | gtk_list_store_iter_is_valid () |
| void | gtk_list_store_reorder () |
| void | gtk_list_store_swap () |
| void | gtk_list_store_move_before () |
| void | gtk_list_store_move_after () |
Типы и значения
| struct | GtkListStore |
Иерархия объектов
GObject ╰── GtkListStore
Реализованные интерфейсы
GtkListStore реализует GtkTreeModel, GtkTreeDragSource, GtkTreeDragDest, GtkTreeSortable и GtkBuildable.
Файлы заголовков
#include <gtk/gtk.h>
Описание
Объект GtkListStore — это модель списка для использования с виджетом GtkTreeView. Он реализует интерфейс GtkTreeModel и, следовательно, может использовать все доступные там методы. Он также реализует интерфейс GtkTreeSortable, чтобы его можно было сортировать с помощью представления. Наконец, он также реализует интерфейсы перемещения и перетаскивания для дерева перетаскивания.
Объект GtkListStore может принимать большинство типов GObject в качестве типа столбца, хотя не все пользовательские типы. Внутренне он будет хранить копию переданных данных (например, строки или упакованного указателя). Столбцы, которые принимают GObject, обрабатываются немного иначе. GtkListStore будет хранить ссылку на объект вместо копирования значения. В результате, если объект модифицируется, разработчик приложения должен вызвать gtk_tree_model_row_changed(), чтобы испустить сигнал “row_changed”. Это чаще всего затрагивает списки сохранёнными GdkPixbufs.
Пример создания простого хранилища списка:
Учёт производительности
Внутренне GtkListStore был реализован в виде связанного списка с указателем на хвост до GTK+ 2.6. В результате, он был быстрым при вставке и удалении данных, но не быстрым при случайном доступе к данным. GtkListStore устанавливает флаг GTK_TREE_MODEL_ITERS_PERSIST, что означает, что GtkTreeIters могут быть кэшированы, пока строка существует. Таким образом, если часто требуется доступ к определённой строке, и ваш код должен работать на старых версиях GTK+, стоит сохранить итератор.
Атомарные операции
Важно отметить, что только методы gtk_list_store_insert_with_values() и gtk_list_store_insert_with_valuesv() атомарны в том смысле, что строка добавляется в хранилище, а значения заполняются в одной операции по отношению к сигнализации GtkTreeModel. В отличие от этого, использование, например, gtk_list_store_append() и затем gtk_list_store_set() сначала создаст строку, что вызовет сигнал “row-inserted” в GtkListStore. Однако строка всё ещё пуста, и любой обработчик сигналов, подключённый к “row-inserted” в этом хранилище, должен быть готов к ситуации, когда строка может быть пустой. Это особенно важно, если вы оборачиваете GtkListStore в GtkTreeModelFilter и используете GtkTreeModelFilterVisibleFunc. Использование любых неатомарных операций для добавления строк в GtkListStore приведёт к тому, что GtkTreeModelFilterVisibleFunc будет вызван с пустой строкой первой; функция должна быть готова к этому.
GtkListStore как GtkBuildable
Реализация GtkListStore интерфейса GtkBuildable позволяет указать столбцы модели с элементом <columns>, который может содержать несколько элементов <column>, каждый из которых определяет один столбец модели. Атрибут «type» указывает тип данных для столбца.
Кроме того, можно указать содержимое хранилища списка в определении пользовательского интерфейса с помощью элемента <data>. Он может содержать несколько элементов <row>, каждый из которых указывает содержимое одной строки модели списка. Внутри <row> элементы <col> определяют содержимое отдельных ячеек.
Обратите внимание, что вероятно, чаще модели определяются в коде, и можно считать нарушением слоёв указать содержимое хранилища списка в определении пользовательского интерфейса; данные, а не представление, и общепринятая точка зрения состоит в том, чтобы разделить эти две вещи, насколько это возможно.
Пример фрагмента определения пользовательского интерфейса для хранилища списка:
Функции
gtk_list_store_new ()
GtkListStore * gtk_list_store_new (gint n_columns,...);
Создаёт новый хранилище списка с n_columns столбцами, каждый из которых имеет указанный тип. Обратите внимание, что поддерживаются только типы, производные от стандартных фундаментальных типов GObject.
Например, gtk_list_store_new (3, G_TYPE_INT, G_TYPE_STRING,
GDK_TYPE_PIXBUF); создаст новое хранилище GtkListStore с тремя столбцами типа int, string и GdkPixbuf соответственно.
Параметры
n_columns | количество столбцов в хранилище списка | |
... | все типы GType для столбцов, от первого до последнего |
Возвращает
новое GtkListStore
gtk_list_store_newv ()
GtkListStore * gtk_list_store_newv (gint n_columns,GType *types);
Функция создания без использования переменного числа аргументов. Используется в основном языковыми связками.
[rename-to gtk_list_store_new]
Параметры
n_columns | количество столбцов в хранилище списка | |
types | массив типов GType для столбцов, от первого до последнего. | [array length=n_columns] |
gtk_list_store_set_column_types ()
void gtk_list_store_set_column_types (GtkListStore *list_store,gint n_columns,GType *types);
Эта функция предназначена в первую очередь для GObject, унаследованных от GtkListStore, и должна использоваться только при создании нового GtkListStore. Она не будет работать после добавления строки или вызова метода интерфейса GtkTreeModel.
Параметры
list_store | ||
n_columns | Количество столбцов для хранилища списка | |
types | массив из n элементов типа GType. | [array length=n_columns] |
gtk_list_store_set ()
void gtk_list_store_set (GtkListStore *list_store,GtkTreeIter *iter,...);
Устанавливает значения одного или нескольких ячеек в строке, на которую ссылается iter. Список аргументов должен содержать номера столбцов (целые числа), а после каждого номера столбца должно следовать значение, которое нужно установить. Список завершается значением -1. Например, чтобы установить столбец 0 типа G_TYPE_STRING со значением “Foo”, необходимо написать gtk_list_store_set (store, iter,
0, "Foo", -1).
Значение будет сохранённо в хранилище, если оно является G_TYPE_OBJECT, и будет скопировано, если это G_TYPE_STRING или G_TYPE_BOXED.
Параметры
list_store | ||
iter | итератор строки | |
... | пары номер_столбца/значение, завершённые -1 |
gtk_list_store_set_valist ()
void gtk_list_store_set_valist (GtkListStore *list_store,GtkTreeIter *iter,va_list var_args);
См. gtk_list_store_set(); этот вариант принимает va_list для использования языковыми связками.
Параметры
list_store | ||
iter | Действительный GtkTreeIter для изменяемой строки | |
var_args | va_list пар столбец/значение |
gtk_list_store_set_value ()
void gtk_list_store_set_value (GtkListStore *list_store,GtkTreeIter *iter,gint column,GValue *value);
Устанавливает данные в ячейке, указанной iter и column . Тип value должен быть конвертируем в тип столбца.
Параметры
list_store | ||
iter | Действительный GtkTreeIter для изменяемой строки | |
column | номер изменяемого столбца | |
value | новое значение для ячейки |
gtk_list_store_set_valuesv ()
void gtk_list_store_set_valuesv (GtkListStore *list_store,GtkTreeIter *iter,gint *columns,GValue *values,gint n_values);
Вариант gtk_list_store_set_valist(), который принимает столбцы и значения в виде двух массивов вместо переменного числа аргументов. Эта функция предназначена в основном для языковых связок и в случае, если количество изменяемых столбцов неизвестно до выполнения.
[rename-to gtk_list_store_set]
Параметры
list_store | ||
iter | Действительный GtkTreeIter для изменяемой строки | |
columns | массив номеров столбцов. | [array length=n_values] |
values | массив GValues. | [array length=n_values] |
n_values | длина массивов |
Since: 2.12
gtk_list_store_remove ()
gboolean gtk_list_store_remove (GtkListStore *list_store,GtkTreeIter *iter);
Удаляет заданную строку из списка хранилищ. После удаления iter устанавливается на следующую допустимую строку или аннулируется, если она указывала на последнюю строку в list_store.
Параметры
list_store | ||
iter | Допустимая GtkTreeIter |
gtk_list_store_insert ()
void gtk_list_store_insert (GtkListStore *list_store,GtkTreeIter *iter,gint position);
Создаёт новую строку в позиции position. iter будет изменено, чтобы указать на эту новую строку. Если position равно -1 или больше, чем количество строк в списке, то новая строка будет добавлена в конец списка. После вызова этой функции строка будет пустой. Чтобы заполнить значения, необходимо вызвать gtk_list_store_set() или gtk_list_store_set_value().
Параметры
list_store | ||
iter | Неинициализированная GtkTreeIter, которая будет установлена на новую строку. | [out] |
position | позиция для вставки новой строки, или -1 для добавления в конец |
gtk_list_store_insert_before ()
void gtk_list_store_insert_before (GtkListStore *list_store,GtkTreeIter *iter,GtkTreeIter *sibling);
Вставляет новую строку перед sibling. Если sibling равно NULL, то строка будет добавлена в конец списка. iter будет изменено, чтобы указать на эту новую строку. После вызова этой функции строка будет пустой. Чтобы заполнить значения, необходимо вызвать gtk_list_store_set() или gtk_list_store_set_value().
Параметры
list_store | ||
iter | Неинициализированная GtkTreeIter, которая будет установлена на новую строку. | [out] |
sibling | Допустимая GtkTreeIter или | [allow-none] |
gtk_list-store_insert_after ()
void gtk_list_store_insert_after (GtkListStore *list_store,GtkTreeIter *iter,GtkTreeIter *sibling);
Вставляет новую строку после sibling. Если sibling равно NULL, то строка будет добавлена в начало списка. iter будет изменено, чтобы указать на эту новую строку. После вызова этой функции строка будет пустой. Чтобы заполнить значения, необходимо вызвать gtk_list_store_set() или gtk_list_store_set_value().
Параметры
list_store | ||
iter | Неинициализированная GtkTreeIter, которая будет установлена на новую строку. | [out] |
sibling | Допустимая GtkTreeIter или | [allow-none] |
gtk_list_store_insert_with_values ()
void gtk_list_store_insert_with_values (GtkListStore *list_store,GtkTreeIter *iter,gint position,...);
Создаёт новую строку в позиции position. iter будет изменено, чтобы указать на эту новую строку. Если position равно -1 или больше, чем количество строк в списке, то новая строка будет добавлена в конец списка. Строка будет заполнена значениями, заданными в этой функции.
Вызов gtk_list_store_insert_with_values (list_store, iter, position...) эквивалентен вызову
enum { COLUMN_STRING, COLUMN_INT, COLUMN_BOOLEAN, N_COLUMNS }; { GtkListStore *list_store; GtkTreePath *path; GtkTreeIter iter; gint i; list_store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); for (i = 0; i < 10; i++) { gchar *some_data; some_data = get_some_data (i); // Add a new row to the model gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, COLUMN_STRING, some_data, COLUMN_INT, i, COLUMN_BOOLEAN, FALSE, -1); // As the store will keep a copy of the string internally, // we free some_data. g_free (some_data); } // Modify a particular row path = gtk_tree_path_new_from_string ("4"); gtk_tree_model_get_iter (GTK_TREE_MODEL (list_store), &iter, path); gtk_tree_path_free (path); gtk_list_store_set (list_store, &iter, COLUMN_BOOLEAN, TRUE, -1); }
с той разницей, что первый вызов генерирует только сигнал row_inserted, а второй — row_inserted, row_changed и, если хранилище списка отсортировано, rows_reordered. Поскольку многократная генерация сигнала rows_reordered может повлиять на производительность программы, gtk_list_store_insert_with_values() обычно предпочтительнее при вставке строк в отсортированное хранилище списка.
Параметры
list_store | ||
iter | Неинициализированная GtkTreeIter, которая будет установлена на новую строку, или | [out][allow-none] |
position | позиция для вставки новой строки, или -1 для добавления в конец после существующих строк | |
... | пары номера столбца и значения, завершаемые -1 |
Since: 2.6
gtk_list_store_insert_with_valuesv ()
void gtk_list_store_insert_with_valuesv (GtkListStore *list_store,GtkTreeIter *iter,gint position,gint *columns,GValue *values,gint n_values);
Вариант функции gtk_list_store_insert_with_values(), принимающий массивы столбцов и значений вместо переменного числа аргументов. Эта функция предназначена в основном для языковых библиотек.
Параметры
list_store | Объект GtkListStore | |
iter | Неинициализированный объект GtkTreeIter для установки новой строки, или | [out][allow-none] |
position | Позиция вставки новой строки; -1 для последней позиции. | |
columns | Массив номеров столбцов. | [array length=n_values] |
values | Массив GValue. | [array length=n_values] |
n_values | Длина массивов |
С: 2.6
gtk_list_store_prepend ()
void gtk_list_store_prepend (GtkListStore *list_store,GtkTreeIter *iter);
Добавляет новую строку в начало list_store. Значение iter будет изменено для указания на эту новую строку. Строка будет пустой после вызова этой функции. Для заполнения значений необходимо вызвать gtk_list_store_set() или gtk_list_store_set_value().
Параметры
list_store | Объект GtkListStore | |
iter | Неинициализированный объект GtkTreeIter для установки на добавленную строку. | [out] |
gtk_list_store_append ()
void gtk_list_store_append (GtkListStore *list_store,GtkTreeIter *iter);
Добавляет новую строку в конец list_store. Значение iter будет изменено для указания на эту новую строку. Строка будет пустой после вызова этой функции. Для заполнения значений необходимо вызвать gtk_list_store_set() или gtk_list_store_set_value().
Параметры
list_store | Объект GtkListStore | |
iter | Неинициализированный объект GtkTreeIter для установки на добавленную строку. | [out] |
gtk_list_store_clear ()
void
gtk_list_store_clear (GtkListStore *list_store); Удаляет все строки из хранилища списка.
Параметры
list_store | объект GtkListStore. |
gtk_list_store_iter_is_valid ()
gboolean gtk_list_store_iter_is_valid (GtkListStore *list_store,GtkTreeIter *iter);
Эта функция медленная. Используйте только для отладки и тестирования.
Проверяет, является ли указанный итератор допустимым для этого объекта GtkListStore.
Параметры
list_store | Объект GtkListStore. | |
iter | Объект GtkTreeIter. |
С: 2.2
gtk_list_store_reorder ()
void gtk_list_store_reorder (GtkListStore *store,gint *new_order);
Переупорядочивает store в соответствии с порядком, указанным в new_order. Обратите внимание, что эта функция работает только с несортированными хранилищами.
Параметры
store | Объект GtkListStore. | |
new_order | Массив целых чисел, отображающий новую позицию каждого элемента относительно его старой позиции до переупорядочения, т.е. | [array zero-terminated=1] |
С: 2.2
gtk_list_store_swap ()
void gtk_list_store_swap (GtkListStore *store,GtkTreeIter *a,GtkTreeIter *b);
Меняет местами a и b в store. Обратите внимание, что эта функция работает только с несортированными хранилищами.
Параметры
store | Объект GtkListStore. | |
a | Объект GtkTreeIter. | |
b | Другой объект GtkTreeIter. |
С: 2.2
gtk_list_store_move_before ()
void gtk_list_store_move_before (GtkListStore *store,GtkTreeIter *iter,GtkTreeIter *position);
Перемещает iter в store на позицию перед position. Обратите внимание, что эта функция работает только с несортированными хранилищами. Если position равен NULL, iter будет перемещен в конец списка.
Параметры
store | Объект GtkListStore. | |
iter | Объект GtkTreeIter. | |
position | Объект GtkTreeIter, или | [allow-none] |
С: 2.2
gtk_list_store_move_after ()
void gtk_list_store_move_after (GtkListStore *store,GtkTreeIter *iter,GtkTreeIter *position);
Перемещает iter в store в позицию после position. Обратите внимание, что эта функция работает только с несортированными хранилищами. Если position равно NULL, iter будет перемещено в начало списка.
Параметры
store | A GtkListStore. | |
iter | A GtkTreeIter. | |
position | A GtkTreeIter или | [allow-none] |
С: 2.2
Типы и значения
struct GtkListStore
struct GtkListStore;
См. также
© 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/GtkListStore.html