更改GTK树视图的内容 [英] Changing the content of a GTK Tree View

查看:78
本文介绍了更改GTK树视图的内容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个简单的GTK程序,它可以创建树状视图:

I have a simple GTK program that creates a Tree View:

static GtkTreeModel *
create_and_fill_model (void)
{
  GtkListStore  *store;
  GtkTreeIter    iter;

  store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING, G_TYPE_UINT);

  /*here is some code adding rows using
    gtk_list_store_append
    gtk_list_store_set*/

  return GTK_TREE_MODEL (store);
}

static GtkWidget *
create_view_and_model (void)
{
  GtkCellRenderer     *renderer;
  GtkTreeModel        *model;
  GtkWidget           *view;

  view = gtk_tree_view_new ();

  renderer = gtk_cell_renderer_text_new ();
  gtk_tree_view_insert_column_with_attributes 
       (GTK_TREE_VIEW(view),-1,"Name",renderer,"text", COL_NAME,NULL);

  renderer = gtk_cell_renderer_text_new ();
  gtk_tree_view_insert_column_with_attributes 
       (GTK_TREE_VIEW(view),-1,"Age",renderer,"text", COL_AGE,NULL);

  model = create_and_fill_model ();

  gtk_tree_view_set_model (GTK_TREE_VIEW (view), model);

  g_object_unref (model);

  return view;
}


int
main (int argc, char **argv)
{
  //usual stuff

  view = create_view_and_model ();

  gtk_container_add (GTK_CONTAINER (window), view);

  //usual stuff
}

有人可以告诉我现在如何更改此树形视图的内容吗?我是否必须再次创建视图"对象?还是我应该打电话 gtk_tree_view_set_model是否具有新模型?

Can somebody tell me how do I now change the content of this treeview? Do I have to create the "view" object again? Or am I supposed to call gtk_tree_view_set_model with new model?

推荐答案

要更改GtkTreeView的内容,必须使用模型.在您的函数中:

To change the contents of the GtkTreeView you must use the model. In your function:

static GtkTreeModel *
create_and_fill_model (void)
{
  GtkListStore  *store;
  GtkTreeIter    iter;

  store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING, G_TYPE_UINT);

  /*here is some code adding rows using
    gtk_list_store_append
    gtk_list_store_set*/

  return GTK_TREE_MODEL (store);
}

它已注释了应该添加数据,检索GtkTreeIter并使用给定的迭代器和函数gtk_list_store_set设置数据的位置.

It's commented the place where you should append data, retrieve the GtkTreeIter and set data with the given iterator and function gtk_list_store_set.

您省略了列的枚举器,但是从模型GtkListStore创建可以看出,您将有2列,其中一列包含字符串,另一列包含无符号整数. GtkTreeModel是商店(树存储和列表存储)实现的接口.

You omitted the enumerator for columns but as can be seen from the model GtkListStore creation, you will have 2 columns, one containing strings and other containing unsigned integers. GtkTreeModel is an interface which the stores (tree store and list store) implement.

GtkTreeView遵循MVC(模型视图控制器)模式,因此该视图将反映来自模型的视图,并且模型可以具有许多视图.想象一下文件浏览器,其中模型包含有关文件的信息,但是您可以拥有多个视图,图标视图或列表视图.

GtkTreeView follows the MVC (Model View Controller) pattern, so the view will reflect a view from a model and a model can have many views. Imagine the file browser where the model contains information about the files but you can have several views, icons view or list view.

以下是一个示例,与您显示的示例非常相似:

Here is an example, very similar to the one you are showing:

#include <gtk/gtk.h>

enum
{
  COL_FIRST_NAME = 0,
  COL_AGE,
  NUM_COLS
} ;

static GtkTreeModel *
create_and_fill_model (void)
{
  GtkListStore  *liststore;
  GtkTreeIter   iter;

  liststore = gtk_list_store_new(NUM_COLS, G_TYPE_STRING, G_TYPE_UINT);

  gtk_list_store_append(liststore, &iter);
  gtk_list_store_set(liststore, &iter,
                     COL_FIRST_NAME, "Joe",
                     COL_AGE, 20,
                     -1);

  gtk_list_store_append(liststore, &iter);
  gtk_list_store_set(liststore, &iter,
                     COL_FIRST_NAME, "Jane",
                     COL_AGE, 24,
                     -1);

  return GTK_TREE_MODEL(liststore);
}

static GtkWidget *
create_view_and_model (void)
{
  GtkTreeViewColumn   *col;
  GtkCellRenderer     *renderer;
  GtkWidget           *view;
  GtkTreeModel        *model;

  view = gtk_tree_view_new();

  /* --- Column #1 --- */

  col = gtk_tree_view_column_new();

  gtk_tree_view_column_set_title(col, "First Name");

  /* pack tree view column into tree view */
  gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);

  /* New text renderer */
  renderer = gtk_cell_renderer_text_new();

  /* pack cell renderer into tree view column */
  gtk_tree_view_column_pack_start(col, renderer, TRUE);

  /* Set view column to model column */
  gtk_tree_view_column_set_attributes(col, renderer, "text", COL_FIRST_NAME, NULL);


  /* --- Column #2 --- */

  col = gtk_tree_view_column_new();

  gtk_tree_view_column_set_title(col, "Age");

  /* pack tree view column into tree view */
  gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);

  /* New text renderer */
  renderer = gtk_cell_renderer_text_new();

  /* pack cell renderer into tree view column */
  gtk_tree_view_column_pack_start(col, renderer, TRUE);

  /* Set view column to model column */
  gtk_tree_view_column_set_attributes(col, renderer, "text", COL_AGE, NULL);

  model = create_and_fill_model();

  gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);

  g_object_unref(model); /* destroy model automatically with view */

  gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)),
                              GTK_SELECTION_NONE);

  return view;
}


int
main (int argc, char **argv)
{
  GtkWidget *window;
  GtkWidget *view;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  g_signal_connect(window, "delete_event", gtk_main_quit, NULL); /* dirty */

  view = create_view_and_model();

  gtk_container_add(GTK_CONTAINER(window), view);

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

请注意如何在create_and_fill_model函数中将数据添加到模型(GtkListStore):

Notice how we add data to the model (GtkListStore) in the create_and_fill_model function:

  ...
  gtk_list_store_append(liststore, &iter);
  gtk_list_store_set(liststore, &iter,
                     COL_FIRST_NAME, "Joe",
                     COL_AGE, 20,
                     -1);
  ...

还要检查我们如何将数据从视图列绑定到模型列:

Check also how we bind data from the view columns to the model columns:

gtk_tree_view_column_set_attributes(col, renderer, "text", COL_FIRST_NAME, NULL);

其中col是带有CellRendererText renderer的第一列.

Where col is the first column with a CellRendererText renderer.

使用(将文件命名为main.c)编译给定的示例:

Compile the given example with (name the file, main.c):

gcc -o main main.c `pkg-config --cflags --libs gtk+-3.0`

结果应该是这样的:

这篇关于更改GTK树视图的内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆