gpt4 book ai didi

c - gtklist[c代码] : how to get the selection of a GtkList

转载 作者:行者123 更新时间:2023-12-03 05:31:12 25 4
gpt4 key购买 nike

下面是引用 very old gtk+1.x FAQ 的代码。目的是获取 GtkList 的选择。我知道 GtkList 已被弃用,应该用 GtkTreeView + GtkListStore 替换。我知道如何使用 GtkListStore。但是,我确实想在当前情况下使用 GtkList,因为 GtkListStore 更复杂。

下面代码的问题是,无论我选择多少个项目,它都不会打印任何内容。请帮忙。我的gtk+版本是2.10.11。

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

最佳答案

也许您应该详细说明您在使用 GtkTreeViewGtkListStore 时遇到的问题,而不是使用像 GtkList 这样早已弃用的小部件。例如,可以使用以下代码来创建 TreeView 并用标签填充它(为了便于理解,我将其分解):

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

如果您可以访问更高版本的 GTK+,您还会拥有更好的便利 API,但上面的代码是使用 GTK+ 2.10 中提供的 API 编写的。

有一个非常全面的在线教程:http://scentric.net/tutorial

如果您可以访问 GTK+ 3.10,您还可以使用 GtkListBox,这是一个更简单的小部件,允许您将多个小部件打包在一个列表中;它不允许多重选择,也不能扩展到数千个项目,但对于更简单的用例,它可能更合适。

我衷心的建议是

  • 开始使用GtkTreeView
  • 如果可能的话,更新到 GTK+ 的最新版本
    • 如果您可以更新到 GTK+ 3.x 那就更好了。

关于c - gtklist[c代码] : how to get the selection of a GtkList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20122232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com