C 如何使用gtk_列表_存储_设置_值?
我需要将文本小部件中的数据存储在liststore的树视图中 为此,我显然应该使用gtk_list_store_set_value,它能够执行正确的类型转换 第一:我不知道怎么做。“想要”是一个GValue,但每次我尝试键入一个,它都会强烈抱怨 第二:如果将非数字输入到连接到gint类型的liststore列的文本字段中,该输出会出现什么错误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到cellrenderer自动生成的反向连接?不要使用
gtk\u list\u store\u set\u value()。首先是关于“键入aGValue
”的注释;你想用什么打字?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);