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”. Это чаще всего затрагивает списки, в которых хранятся GdkTextures.
Пример создания простого объекта list store:
Учёт производительности
Внутренне GtkListStore изначально был реализован с помощью связанного списка с указателем на хвост. В результате он был быстрым при вставке и удалении данных, но медленным при случайном доступе к данным. GtkListStore устанавливает флаг GTK_TREE_MODEL_ITERS_PERSIST, что означает, что GtkTreeIters можно кэшировать, пока строка существует. Таким образом, если часто требуется доступ к определённой строке и ваш код ожидается в старых версиях GTK, стоит сохранить iter.
Атомарные операции
Важно отметить, что только методы 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” указывает тип данных для столбца.
Кроме того, возможно указать содержимое list store в определении пользовательского интерфейса с помощью элемента <data>. Он может содержать несколько элементов <row>, каждый из которых задаёт содержимое одной строки модели списка. Внутри <row> элементы <col> указывают содержимое отдельных ячеек.
Обратите внимание, что, вероятно, чаще модели определяются в коде, и можно считать нарушением слоёв указывать содержимое list store в определении пользовательского интерфейса, так как данные не относятся к представлению, а общепринято разделять эти аспекты.
Пример фрагмента определения пользовательского интерфейса для list store:
Функции
gtk_list_store_new ()
GtkListStore * gtk_list_store_new (int n_columns,...);
Создаёт новый список хранилищ со n_columns столбцами, каждый из которых имеет тип, переданный в качестве параметра. Обратите внимание, что поддерживаются только типы, производные от стандартных фундаментальных типов GObject.
Например, gtk_list_store_new (3, G_TYPE_INT, G_TYPE_STRING,
GDK_TYPE_TEXTURE); создаст новое хранилище GtkListStore с тремя столбцами, имеющими типы int, string и GdkTexture соответственно.
Параметры
n_columns | количество столбцов в хранилище | |
... | все типы GType для столбцов, от первого до последнего |
Возвращает
новое хранилище GtkListStore
gtk_list_store_newv ()
GtkListStore * gtk_list_store_newv (int 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,int n_columns,GType *types);
Эта функция предназначена в первую очередь для GObject объектов, наследующих от 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_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,int 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,int *columns,GValue *values,int 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 | длина массивов |
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,int 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,int 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;
int i;
list_store = gtk_list_store_new (N_COLUMNS,
G_TYPE_STRING,
G_TYPE_INT,
G_TYPE_BOOLEAN);
for (i = 0; i < 10; i++)
{
char *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 |
gtk_list_store_insert_with_valuesv ()
void gtk_list_store_insert_with_valuesv (GtkListStore *list_store,GtkTreeIter *iter,int position,int *columns,GValue *values,int 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 | длина массивов |
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 если итератор некорректен.
gtk_list_store_reorder ()
void gtk_list_store_reorder (GtkListStore *store,int *new_order);
Переупорядочивает store в соответствии с порядком, указанным в new_order. Обратите внимание, что эта функция работает только со списками, не отсортированными по умолчанию.
Параметры
store | A GtkListStore. | |
new_order | массив целых чисел, отображающий новую позицию каждого элемента относительно его старой позиции до переупорядочения, т.е. | [array zero-terminated=1] |
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. |
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] |
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] |
Типы и значения
struct GtkListStore
struct GtkListStore;
См. также
© 2005–2020 The GNOME Project
Licensed under the GNU Lesser General Public License version 2.1 or later.
https://developer-old.gnome.org/gtk4/4.0/GtkListStore.html