Как я могу использовать gtk_list_store_set_value? - PullRequest
2 голосов
/ 17 мая 2011

Мне нужно хранить данные из текстовых виджетов в виде дерева в хранилище списков.

Для этого мне, очевидно, следует использовать gtk_list_store_set_value, который способен выполнять правильный тип-тип.

Первое: Iне знаю какОн хочет получить значение GValue, но каждый раз, когда я пытаюсь набрать один, он энергично жалуется.

Второе: какие ошибки выдали бы эти выходные данные, если бы нечисловое число было введено в текстовое поле, которое связано со столбцом списка списков типа gint?

В-третьих: есть какой-то более простой способ, которым я, кажется, скучаю?Обратное соединение, подобное тому, которое автоматически создается из хранилища списков в cellrenderer?

Ответы [ 2 ]

4 голосов
/ 19 мая 2011

Не используйте gtk_list_store_set_value(), так как есть более простой способ, которого вам не хватает.Сначала заметка о «типизировании GValue»;что вы пытаетесь набрать из ?GValue - это контейнер для произвольного типа данных, он не может быть преобразован ни в какой встроенный тип или в любой тип GObject.Вам нужно создать его.

Однако использование gtk_list_store_set() позаботится о создании и освобождении всех ваших GValue s, поэтому вам не нужно об этом беспокоиться.Это работает так:

gtk_list_store_set(list_store, &iter,
    column_number_1, value_1,
    column_number_2, value_2,
    ...,
    -1);

Таким образом, чтобы установить один столбец (скажем, номер 0) типа gint, вы должны сделать gtk_list_store_set(list_store, &iter, 0, int_value, -1);

Не полагаться на GTKпроверить ввод текстового поля.Намного лучше решить для себя, какие значения являются действительными, и проверить их самостоятельно, прежде чем вставлять их в хранилище списков.Это предотвратит неприятные сюрпризы, когда кто-то введет значение, которого вы не ожидаете.

2 голосов
/ 30 сентября 2012

Вам нужно создать iter, добавить строку к модели, используя gtk_list_store_append, которая установит iter. Затем вам нужно создать GValue и установить его тип и значение, используя функции, описанные здесь . Наконец, вызовите gtk_list_store_set_value, передавая это GValue в качестве ссылки. Как это выглядит:

GtkListStore* model = gtk_list_store_new(columns, ...);

GtkTreeIter iter;
gtk_list_store_append(model, &iter);

for(int j = 0; j < columns; j++) {
    GValue value = G_VALUE_INIT;
    g_value_init(&value, G_TYPE_FLOAT);
    g_value_set_float(&value, 0.0);
    gtk_list_store_set_value(model, &iter, j, &value);
}

gtk_list_store_set_value был единственным вариантом, который я нашел для динамического создания столбцов (все они одного типа). Который, кстати, если вам это тоже нужно, вот как я это сделал:

GType* types = (GType*) malloc(columns * sizeof(G_TYPE_FLOAT));
for(int i = 0; i < columns; i++) {
    types[i] = G_TYPE_FLOAT;
}

GtkListStore* model = gtk_list_store_newv(columns, types);
free(types);
...