作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面是引用 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;
}
最佳答案
也许您应该详细说明您在使用 GtkTreeView
和 GtkListStore
时遇到的问题,而不是使用像 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
关于c - gtklist[c代码] : how to get the selection of a GtkList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20122232/
我是一名优秀的程序员,十分优秀!