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 в качестве типа столбца, хотя не все пользовательские типы поддерживаются. Внутренне он хранит копию переданных данных (таких как строка или указатель на упакованный объект). Столбцы, принимающие GObjects, обрабатываются немного по-другому. 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 с тремя столбцами: целого типа, строки и 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);
Эта функция предназначена в первую очередь для GObjects, унаследованных от GtkListStore, и должна использоваться только при создании нового GtkListStore. Она не будет работать после добавления строки или вызова метода интерфейса GtkTreeModel.
Параметры
list_store | ||
n_columns | Количество столбцов для хранилища списка | |
types | Массив длиной n из GTypes. | [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_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 | длина массивов |
С: 2.12
gtk_list_store_remove ()
gboolean gtk_list_store_remove (GtkListStore *list_store,GtkTreeIter *iter);
Удаляет заданную строку из хранилища списка. После удаления iter устанавливается на следующую действительную строку или аннулируется, если она указывала на последнюю строку в list_store.
Параметры
list_store | ||
iter | Действительный GtkTreeIter |
Возвращаемое значение
TRUE , если iter действителен, FALSE если нет.
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 |
С: 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 | ||
iter | Неинициализированный GtkTreeIter, который нужно установить на новую строку, или | [out][allow-none] |
position | Позиция вставки новой строки, или -1 для добавления в конец | |
columns | массив номеров колонок. | [array length=n_values] |
values | массив GValues. | [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 | ||
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 | ||
iter | Незаданная GtkTreeIter для присвоения значения строки, добавленной в конец. | [out] |
gtk_list_store_clear ()
void
gtk_list_store_clear (GtkListStore *list_store); Удаляет все строки из списка.
Параметры
list_store | a GtkListStore. |
gtk_list_store_iter_is_valid ()
gboolean gtk_list_store_iter_is_valid (GtkListStore *list_store,GtkTreeIter *iter);
Эта функция медленная. Используйте её только для отладки и тестирования.
Проверяет, является ли заданный итератор допустимым для этого GtkListStore.
Параметры
list_store | A GtkListStore. | |
iter | A GtkTreeIter. |
Возвращает
TRUE если итератор допустим, FALSE если итератор недопустим.
Since: 2.2
gtk_list_store_reorder ()
void gtk_list_store_reorder (GtkListStore *store,gint *new_order);
Изменяет порядок store в соответствии с порядком, указанным в new_order . Обратите внимание, что эта функция работает только с несортированными хранилищами.
Параметры
store | A GtkListStore. | |
new_order | массив целых чисел, сопоставляющий новое положение каждого элемента с его старым положением до переупорядочивания, т.е. | [array zero-terminated=1] |
Since: 2.2
gtk_list_store_swap ()
void gtk_list_store_swap (GtkListStore *store,GtkTreeIter *a,GtkTreeIter *b);
Меняет местами a и b в store . Обратите внимание, что эта функция работает только с несортированными хранилищами.
Параметры
store | A GtkListStore. | |
a | A GtkTreeIter. | |
b | Другой GtkTreeIter. |
Since: 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 | A GtkListStore. | |
iter | A GtkTreeIter. | |
position | A GtkTreeIter, или | [allow-none] |
Since: 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] |
Since: 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.24/GtkListStore.html