C 如何使用gtk_列表_存储_设置_值?

C 如何使用gtk_列表_存储_设置_值?,c,model-view-controller,gtk,signals,C,Model View Controller,Gtk,Signals,我需要将文本小部件中的数据存储在liststore的树视图中 为此,我显然应该使用gtk_list_store_set_value,它能够执行正确的类型转换 第一:我不知道怎么做。“想要”是一个GValue,但每次我尝试键入一个,它都会强烈抱怨 第二:如果将非数字输入到连接到gint类型的liststore列的文本字段中,该输出会出现什么错误 第三:有没有更简单的方法让我觉得自己好像失踪了?像从liststore到cellrenderer自动生成的反向连接?不要使用gtk\u list\u st

我需要将文本小部件中的数据存储在liststore的树视图中

为此,我显然应该使用gtk_list_store_set_value,它能够执行正确的类型转换

第一:我不知道怎么做。“想要”是一个GValue,但每次我尝试键入一个,它都会强烈抱怨

第二:如果将非数字输入到连接到gint类型的liststore列的文本字段中,该输出会出现什么错误


第三:有没有更简单的方法让我觉得自己好像失踪了?像从liststore到cellrenderer自动生成的反向连接?

不要使用
gtk\u list\u store\u set\u value()。首先是关于“键入a
GValue
”的注释;你想用什么打字?
GValue
是一个用于任意数据类型的容器,它不能强制转换为任何内置类型或任何GObject类型。你需要构建它

但是,使用
gtk\u list\u store\u set()
将负责构造和释放所有
GValue
s,因此您无需担心它。它的工作原理如下:

gtk_list_store_set(list_store, &iter,
    column_number_1, value_1,
    column_number_2, value_2,
    ...,
    -1);
因此,要设置类型为
gint
的单个列(比如数字0),您需要执行
gtk\u list\u store\u set(list\u store,&iter,0,int\u value,-1)


不要依赖GTK来验证文本字段的输入。最好自己决定哪些值是有效的,并在将它们插入列表存储之前自己检查它们。这将防止在有人输入您不期望的值时出现任何令人不快的意外情况。

您需要创建一个iter,使用将设置iter的
gtk\u list\u store\u append
在模型中追加一行。然后,您需要创建一个GValue,并使用最后描述的函数设置它的类型和值调用
gtk\u list\u store\u set\u 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);
}

没有办法确定gtkliststore中的列类型,因此除非我计划制作20个不同的处理程序来解决这个无法解决的问题。
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);