编辑GtkTreeView的难度

我正在编写一个软件,我的用户应该能够将数据添加到类似于表格的编辑小部件,我设法通过使用GtkTreeView进行渲染。 我可以通过此调用设置其editable属性来呈现我的单元格

 g_object_set(content_renderer, "editable", TRUE, NULL); 

但是,我的GtkTreeView不仅保留输入的值,因为它甚至没有显示我在渲染之前添加的数据。 我在Web上看到了一些示例,开发人员手动将用户输入数据设置为模型,但所有这些都是使用Python或C ++编写的,使用这些语言提供的绑定,因此不直接解决我的问题。

我写了这个(不是那么)小例子 ,成功地显示了问题。

如何在GtkTreeView中使用户输入数据持久存在?

PS:我的问题在某种程度上与这个有关,但是这个解决方案并不适用于我。

编辑 :我跟着@PhillipWood提示并将我的GtkCellRendererText连接到edited信号,并手动将新数据设置到模型中。

但是,我在编辑之前输入的数据和我在编辑期间输入的数据都没有显示在网格中。

我在Fedora 19下,GTK + 3.8.8。

您需要连接到单元格渲染器的“已编辑”信号。 这是在用户完成编辑时发出的,由应用程序(即您的代码)决定是否将新值存储在模型的正确列中。

更新:

查看更新的代码有一些突出的东西。

首先,当您使用GtkListStoreGtkTreeStore ,最好创建一个用于索引列的枚举。

 enum {COLUMN_LABEL, COLUMN_CONTENT, COLUMN_LAST}; 

然后在创建列表存储时执行

 list_store = gtk_list_store_new(COLUMN_LAST, G_TYPE_STRING, G_TYPE_INT); 

创建树列时,需要告诉它使用cellrenderer显示模型的哪些列。 您可以通过将cellrenderer的属性绑定到模型中的列来完成此操作

 label_col = gtk_tree_view_column_new_with_attributes ("Layer", gtk_cell_renderer_text_new(), "text", COLUMN_LABEL, NULL); 

现在,模型的内容列存储了一个int,因此我们不能只是绑定渲染器的text属性,因为它需要一个字符串。 我们需要使用将列内容映射到text属性

 content_column = gtk_tree_view_column_new (); gtk_tree_view_column_set_cell_data_func (content_column, gtk_cell_renderer_text_new (), content_column_data_func, NULL, NULL); 

 static void content_column_data_func (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) { int value; gchar text; gtk_tree_model_get (tree_model, iter, COLUMN_CONTENT, &value, -1); text = g_strdup_printf ("%d", value); g_object_set (cell, "text", text); g_free (text); } 

最后,在编辑的回调中,您需要在存储之前将字符串转换为整数

 int value = atoi (new_text); gtk_list_store_set (list_store, &iter, COLUMN_CONTENT, value, -1);