我需要将文本小部件中的数据存储在liststore中的树视图中。
为此,我显然应该使用能够执行正确类型转换的gtk_list_store_set_value。
第一:我不知道怎么做。它想要一个GValue,但每当我试图强调一个它就会大力抱怨。
第二:如果将非数字输入到连接到gint类型的liststore列的文本字段中,那么输出会出现什么错误?
第三:我有什么比这更容易的方法吗?反向连接,如从liststore到cellrenderer自动生成的反向连接?答案 0 :(得分:4)
不要使用gtk_list_store_set_value()
,因为您有一种更容易的方法。首先注意“类型化GValue
”;你想从中对进行类型转换? GValue
是任意数据类型的容器,它不能转换为任何内置类型或任何GObject类型。你需要构建它。
然而,使用gtk_list_store_set()
将负责构建和释放所有GValue
,因此您无需担心它。它的工作原理如下:
gtk_list_store_set(list_store, &iter,
column_number_1, value_1,
column_number_2, value_2,
...,
-1);
因此,要设置gint
类型的单个列(假设编号为0),您可以执行gtk_list_store_set(list_store, &iter, 0, int_value, -1);
不要依赖GTK来验证文本字段的输入。最好自己决定哪些值是有效的,并在将它们插入列表存储之前自己检查它们。当有人输入你不期望的价值时,这将防止任何令人讨厌的意外。
答案 1 :(得分:2)
您需要创建一个iter,使用gtk_list_store_append
向模型追加一行,以设置iter。然后,您需要创建一个GValue并使用描述的here.函数设置它的类型和值。最后调用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);