我正在编写一个软件,我的用户应该能够将数据添加到类似于表的编辑小部件中,我通过使用GtkTreeView来渲染这个小部件。通过此调用设置单元格的editable属性,使其可以编辑。
g_object_set(content_renderer,
"editable", TRUE,
NULL);但是,我的GtkTreeView不仅没有保留输入的值,因为它甚至没有显示我在呈现之前添加的数据。我在web中看到了一些示例,开发人员手动将用户输入数据设置为模型,但所有这些都是用Python或C++为这些语言提供的绑定编写的,因此不直接解决我的问题。
我编写了这个(不是这样)的小例子,其中成功地展示了问题。
如何使用户输入数据在GtkTreeView中持久
P.S.:我的问题在某种程度上与这一个有关,但是这个解决方案不适用于我。
编辑:我遵循@PhillipWood提示并将我的GtkCellRendererText连接到edited信号,并手动将新数据设置到模型中。
但是,我在版本之前输入的数据和我在版本中输入的数据都没有出现在网格中。
我在Fedora 19下,GTK+ 3.8.8。
发布于 2014-05-27 15:57:36
您需要连接到单元格渲染器的“编辑”信号。这将在用户完成编辑时发出,这取决于应用程序(即您的代码)是否将新值存储在模型的正确列中。
更新:
从更新的代码来看,有几件事情是非常突出的。
首先,当您使用GtkListStore或GtkTreeStore时,创建索引列的枚举是一个好主意。
enum {COLUMN_LABEL, COLUMN_CONTENT, COLUMN_LAST};然后,当您创建列表存储区时,请执行
list_store = gtk_list_store_new(COLUMN_LAST, G_TYPE_STRING, G_TYPE_INT);创建树列时,需要告诉它要用单元渲染器显示模型的哪一列。为此,可以将单元格呈现器的属性绑定到模型中的列。
label_col = gtk_tree_view_column_new_with_attributes ("Layer",
gtk_cell_renderer_text_new(),
"text", COLUMN_LABEL,
NULL);现在,模型的content列存储一个int,因此我们不能仅仅绑定呈现器的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);https://stackoverflow.com/questions/23879624
复制相似问题