Spec-Zone.ru › GTK 3.24

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]

Возвращаемое значение

новый GtkListStore.

[transfer full]

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

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_BOXED.

Параметры

list_store

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

GtkListStore

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

GtkListStore

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

GtkListStore

iter

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

columns

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

[array length=n_values]

values

массив GValues.

[array length=n_values]

n_values

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

С: 2.12

gtk_list_store_remove ()

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

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

Параметры

list_store

GtkListStore

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

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,
                                   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

A GtkListStore

iter

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

[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

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

С: 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

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 если итератор недопустим.

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

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

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

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

[allow-none]

Since: 2.2

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

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.gnome.org/gtk3/3.24/GtkListStore.html

Spec-Zone.ru

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