Difficulty in editable GtkTreeView

丶灬走出姿态 提交于 2019-12-25 05:51:13

问题


I am writing a piece of software where my user should be able to add data to a table-like editing widget, which I managed to render by using a GtkTreeView. I was able to render my cell editable by setting its editable property via this call

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

However, my GtkTreeView not only doesn't retain values entered as it's not even showing the data I've added before rendering. I saw a few examples in the web where the developer manually set the user input data to the model but all of these were either written in Python or C++ using offered bindings for these languages and therefore don't address my issue directly.

I've written this (not so) small example where the problem is successfully shown.

How can I make user input data persistent in a GtkTreeView?

P.S.: my problem is somehow related to this one, however this solution doesn't apply to me.

EDIT: I followed @PhillipWood hint and connected my GtkCellRendererText to the edited signal, and also set by hand the new data into the model.

HOWEVER, neither the data I've entered prior to the edition nor the data I've entered during the edition appear in the grid.

I am under Fedora 19, with GTK+ 3.8.8.


回答1:


You need to connect to the 'edited' signal of the cell renderer. This is emitted when the user finishes editing, it is up to the application (i.e. your code) to store the new value in the correct column of the model.

Update:

Looking at your updated code there are a few things that stand out.

Firstly when you use a GtkListStore or a GtkTreeStore it is a good idea to create an enum for indexing the columns.

enum {COLUMN_LABEL, COLUMN_CONTENT, COLUMN_LAST};

Then when you create the list store do

list_store = gtk_list_store_new(COLUMN_LAST, G_TYPE_STRING, G_TYPE_INT);

When you create a tree column you need to tell it which column(s) of the model to display with the cellrenderer. You do this by binding properties of the cellrenderer to columns in the model

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

Now the content column the model stores an int so we cannot just bind the text property of the renderer as it expects a string. We need to map the column contents onto the text property using

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);

with

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);
}

Finally in the edited callback you need to convert the string to an integer before you store it

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


来源:https://stackoverflow.com/questions/23879624/difficulty-in-editable-gtktreeview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!