C ple选择,并且不能扩展到数千项,但是对于更简单的用例,它可能更合适

C ple选择,并且不能扩展到数千项,但是对于更简单的用例,它可能更合适,c,list,gtk,selection,C,List,Gtk,Selection,我衷心的建议是 开始使用GtkTreeView 如果可能的话,更新到GTK的最新版本+ 如果你能升级到GTK+3.x,肯定会更好 到ntd:在GTK\u选择\u多重模式下,如何取消选择项目?按住CTRL并单击鼠标左键可以切换选择,但不会发出信号unselect child。在这种情况下,选择是混乱的。对于ntd:对于GTK_selection_SINGLE mode,我的原始代码是有效的。@warem:实现细节基本上意味着一切都可能发生。此外,弃用意味着不会修复任何错误,因此,如果GTK\

我衷心的建议是

  • 开始使用
    GtkTreeView
  • 如果可能的话,更新到GTK的最新版本+
    • 如果你能升级到GTK+3.x,肯定会更好

到ntd:在GTK\u选择\u多重模式下,如何取消选择项目?按住
CTRL
并单击鼠标左键可以切换选择,但不会发出信号
unselect child
。在这种情况下,选择是混乱的。对于ntd:对于GTK_selection_SINGLE mode,我的原始代码是有效的。@warem:实现细节基本上意味着一切都可能发生。此外,弃用意味着不会修复任何错误,因此,如果
GTK\u SELECTION\u SINGLE
因错误而无法工作,您将自行解决。在这里,我想回答你的问题,但我要重复ebassi的建议:如果你想让你(和你的用户)的生活更健康,只需更新你的代码。GtkList是如此不受欢迎,甚至一点都不好笑。您不应该在新编写的代码中使用它。通过使用这种版本,您永远不会得到任何错误修复或支持。我使用GtkListStore没有任何问题,因为我已经在代码中更多地使用了它。对于所讨论的问题,这是一个仅显示一列并提供多个选择的简单案例。正如您的代码所示,要使用GtkListStore,我们使用渲染器定义列类型并检索iter以获取行。对于我的问题,我只想使用GtkList简化代码。但Gtklist似乎不支持多重选择,我不得不放弃,转而使用GtkListStore。无论如何,谢谢你的帖子。我正在使用MinGW开发代码。我曾经尝试过GTK+3.x(非官方版本),但是
demo
中的一些函数异常退出。然后我放弃了寻找问题所在的努力。我将代码维护为两个版本:2.10.11和2.22.1。我刚刚浏览了gtk网站,惊奇地发现它发布了适用于win32的3.6.4版本。长期以来,官方网站一直将2.24.x作为最新版本发布。也许我应该试试最新的官方3.x版本。
#include <gtk/gtk.h>

void list_changed (GtkList *list, GtkWidget *widget, gpointer user_data)
{
  GList   *items;

  items=GTK_LIST(list)->selection;
  printf("Selected Items: ");
  while (items) 
  {
    if (GTK_IS_LIST_ITEM(items->data))
        printf("%d ", (guint) 
    gtk_object_get_user_data(items->data));
    items=items->next;
  }
  printf("\n");
}

int main(int argc, char *argv[]) 
{
    GtkWidget *window, *list_item, *list;
    guint i;
    gchar *list_items[]={"Item0", "Item1", "foo", "last Item",};
    guint nlist_items=sizeof(list_items)/sizeof(list_items[0]);

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), window);
    gtk_window_set_title(GTK_WINDOW(window), "GtkList");
    gtk_widget_show_all(window);

    list=gtk_list_new();
    gtk_list_set_selection_mode(GTK_LIST(list), GTK_SELECTION_MULTIPLE);
    gtk_container_add(GTK_CONTAINER(window), list);
    gtk_widget_show (list);
    g_signal_connect(G_OBJECT(list), "select-child", G_CALLBACK(list_changed), window);

    for (i = 0; i < nlist_items; i++)
    {
      list_item=gtk_list_item_new_with_label(list_items[i]);
      gtk_object_set_user_data(GTK_OBJECT(list_item), (gpointer)i);
      gtk_container_add(GTK_CONTAINER(list), list_item);
      gtk_widget_show(list_item);
    }

    gtk_main();

    return 0;
}
items=GTK_LIST(list)->selection;
#include <gtk/gtk.h>

static void
dump_items(const GSList *items)
{
    const GSList *item;
    gint n;

    g_print("Selection:");
    for (item = items; item; item = item->next) {
        n = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(item->data), "n"));
        g_print(" %d", n);
    }
    g_print("\n");
}

static void
add_item(GtkList *list, GtkWidget *item, GSList **p_items)
{
    *p_items = g_slist_remove(*p_items, item);
    *p_items = g_slist_append(*p_items, item);
    dump_items(*p_items);
}

static void
remove_item(GtkList *list, GtkWidget *item, GSList **p_items)
{
    *p_items = g_slist_remove(*p_items, item);
    dump_items(*p_items);
}

gint
main(gint argc, gchar *argv[])
{
    GtkWidget *window, *item, *list;
    GSList *items = NULL;
    gchar **p_label, *labels[] = {
        "Item0", "Item1", "foo", "last Item",
        NULL
    };

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_window_set_title(GTK_WINDOW(window), "GtkList");

    list = gtk_list_new();
    gtk_list_set_selection_mode(GTK_LIST(list), GTK_SELECTION_MULTIPLE);
    gtk_container_add(GTK_CONTAINER(window), list);
    g_signal_connect(list, "select-child", G_CALLBACK(add_item), &items);
    g_signal_connect(list, "unselect-child", G_CALLBACK(remove_item), &items);

    for (p_label = labels; *p_label; ++p_label) {
      item = gtk_list_item_new_with_label(*p_label);
      g_object_set_data(G_OBJECT(item), "n", GINT_TO_POINTER(p_label - labels));
      gtk_container_add(GTK_CONTAINER(list), item);
    }

    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}
enum {
  COLUMN_TEXT,

  N_COLUMNS
};

static const char *labels[] = {
  "Item 0",
  "Item 1",
  "foo",
  "Last item"
};

GtkTreeModel *
populate_store (void);
{
  GtkListStore *store;
  int i;

  store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING);

  for (i = 0; i < G_N_ELEMENTS (labels); i++)
    {
      gtk_list_store_insert_with_values (store, NULL, i,
                                         COLUMN_TEXT, labels[i],
                                         -1);
    }

  return GTK_TREE_MODEL (store);
}

GtkWidget *
create_tree_view (GtkTreeModel *model)
{
  GtkWidget *widget;

  /* renderer for the column */
  renderer = gtk_cell_renderer_text_new ();

  /* column, to pack renderers and bind them to a column in the model */
  column = gtk_tree_view_column_new_with_attributes ("Items",
                                                     renderer,
                                                     "text", COLUMN_TEXT,
                                                     NULL);

  /* text view, to pack all columns */
  widget = gtk_tree_view_new_with_model (model);
  gtk_tree_view_append_column (GTK_TREE_VIEW (widget), column);

  return widget;
}