Spec-Zone.ru › GTK 4.0

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]

Возвращает

новое хранилище GtkListStore.

[transfer full]

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

A GtkListStore

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

a GtkListStore

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

A GtkListStore

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

A GtkListStore

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

A GtkListStore

iter

Действительный GtkTreeIter для строки, которую нужно изменить

columns

массив номеров столбцов.

[array length=n_values]

values

массив GValues.

[array length=n_values]

n_values

длина массивов columns и values

gtk_list_store_remove ()

gboolean
gtk_list_store_remove (GtkListStore *list_store,
                       GtkTreeIter *iter);

Удаляет заданную строку из хранилища списка. После удаления iter устанавливается на следующую действительную строку или становится недействительной, если она указывала на последнюю строку в list_store .

Параметры

list_store

A GtkListStore

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

A GtkListStore

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

A GtkListStore

iter

Неинициализированный GtkTreeIter, который будет установлен на новую строку.

[out]

sibling

Действительный GtkTreeIter, или NULL.

[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

A GtkListStore

iter

Неинициализированный GtkTreeIter, который будет установлен на новую строку.

[out]

sibling

Действительный GtkTreeIter, или NULL.

[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

A GtkListStore

iter

Неинициализированный GtkTreeIter, который будет установлен на новую строку, или NULL.

[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

A GtkListStore

iter

Неинициализированный GtkTreeIter, который будет установлен на новую строку, или NULL.

[out][allow-none]

position

позиция для вставки новой строки, или -1 для добавления в конец

columns

массив номеров колонок.

[array length=n_values]

values

массив GValues.

[array length=n_values]

n_values

длина массивов columns и 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

A 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

A GtkListStore

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

массив целых чисел, отображающий новую позицию каждого элемента относительно его старой позиции до переупорядочения, т.е. new_order [newpos] = oldpos. Он должен содержать ровно столько элементов, сколько строк в списке.

[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, или NULL.

[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 или NULL.

[allow-none]

Типы и значения

struct GtkListStore

struct GtkListStore;

См. также

GtkTreeModel, GtkTreeStore

© 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

Spec-Zone.ru

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