c - 可编辑 GtkTreeView 的困难

标签 c model-view-controller treeview gtk user-input

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

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

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

我写了this (not so) small example问题已成功显示。

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

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

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

但是,我在版本之前输入的数据和我在版本期间输入的数据都不会出现在网格中。

我使用的是 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 的属性绑定(bind)到模型中的列来实现此目的

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

现在,模型的内容列存储一个 int,因此我们不能只绑定(bind)渲染器的 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);

关于c - 可编辑 GtkTreeView 的困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23879624/

相关文章:

c - unix网络编程书中的wait函数?

ruby-on-rails - 如何让 View 更简单, Controller 更有用?

javascript - 从 Ember.TextField 中收集和使用值

android - Android 中的多级 TreeView

.net - 如何在 TreeView 外部绘制 TreeView 节点+/-按钮?

c - C 中的 AF_PACKET 套接字不使用 SOCK_RAW 发送空 UDP 数据包

c - 为什么所有功能都不起作用?

c - 为什么这个功能会导致不停打印?

php - 如何将模型加载到 MVC 中的 Controller 中

delphi - TreeView:如何确定节点是否处于编辑模式?