首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可编辑GtkTreeView的困难

可编辑GtkTreeView的困难
EN

Stack Overflow用户
提问于 2014-05-27 01:03:19
回答 1查看 225关注 0票数 0

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

代码语言:javascript
运行
复制
g_object_set(content_renderer,
        "editable", TRUE,
        NULL);

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

我编写了这个(不是这样)的小例子,其中成功地展示了问题。

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

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

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

但是,我在版本之前输入的数据和我在版本中输入的数据都没有出现在网格中。

我在Fedora 19下,GTK+ 3.8.8。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-27 15:57:36

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

更新:

从更新的代码来看,有几件事情是非常突出的。

首先,当您使用GtkListStoreGtkTreeStore时,创建索引列的枚举是一个好主意。

代码语言:javascript
运行
复制
enum {COLUMN_LABEL, COLUMN_CONTENT, COLUMN_LAST};

然后,当您创建列表存储区时,请执行

代码语言:javascript
运行
复制
list_store = gtk_list_store_new(COLUMN_LAST, G_TYPE_STRING, G_TYPE_INT);

创建树列时,需要告诉它要用单元渲染器显示模型的哪一列。为此,可以将单元格呈现器的属性绑定到模型中的列。

代码语言:javascript
运行
复制
label_col = gtk_tree_view_column_new_with_attributes ("Layer",
                                                      gtk_cell_renderer_text_new(),
                                                      "text", COLUMN_LABEL, 
                                                      NULL);

现在,模型的content列存储一个int,因此我们不能仅仅绑定呈现器的text属性,因为它需要一个字符串。我们需要使用以下方法将列内容映射到文本属性

代码语言:javascript
运行
复制
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);

使用

代码语言:javascript
运行
复制
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);
}

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

代码语言:javascript
运行
复制
int value = atoi (new_text);
gtk_list_store_set (list_store, &iter, COLUMN_CONTENT, value, -1);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23879624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档