提问人:Holger 提问时间:11/16/2023 最后编辑:Holger 更新时间:11/16/2023 访问量:59
ListView 显示未定义的字符、GTK4 和 c
ListView shows undefined characters, GTK4 and c
问:
GTK4 中新的列表模型是一个真正的挑战。不幸的是,我目前 卡住了。 下面的列表显示了我的当前状态。
#include <gtk/gtk.h>
static GListModel* create_model()
{
GListStore *store;
store = g_list_store_new(G_TYPE_OBJECT);
g_list_store_append(store, gtk_string_object_new("London"));
g_list_store_append(store, gtk_string_object_new("Paris"));
g_list_store_append(store, gtk_string_object_new("Berlin"));
return G_LIST_MODEL (store);
}
static void setup_list_item_cb (GtkListItemFactory *factory, GtkListItem *list_item)
{
GtkWidget *label = gtk_label_new (NULL);
gtk_list_item_set_child (GTK_LIST_ITEM(list_item), label);
}
static void bind_list_item_cb (GtkListItemFactory *factory, GtkListItem *list_item)
{
GtkWidget *label = gtk_list_item_get_child (list_item);
const char *string = gtk_list_item_get_item(list_item);
gtk_label_set_text (GTK_LABEL (label), string);
}
static void activate (GtkApplication *app, gpointer user_data)
{
GtkWidget *window; GtkWidget *scrolled_window;
GtkWidget *list_view;
GtkListItemFactory *factory;
GListModel *model;
model = create_model();
GtkSingleSelection *selection;
selection = gtk_single_selection_new(G_LIST_MODEL(model));
gtk_single_selection_set_autoselect(selection,TRUE);
window = gtk_application_window_new (app);
gtk_window_set_title (GTK_WINDOW (window), "ListView Example");
gtk_window_set_default_size (GTK_WINDOW (window), 300, 200);
scrolled_window = gtk_scrolled_window_new ();
gtk_window_set_child (GTK_WINDOW (window), scrolled_window);
list_view = gtk_list_view_new (GTK_SELECTION_MODEL(selection), factory);
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolled_window), list_view);
factory = gtk_signal_list_item_factory_new ();
g_signal_connect (factory, "setup", G_CALLBACK (setup_list_item_cb), NULL);
g_signal_connect (factory, "bind", G_CALLBACK (bind_list_item_cb), NULL);
gtk_list_view_set_factory (GTK_LIST_VIEW (list_view), factory);
gtk_window_present (GTK_WINDOW (window));
}
int main (int argc, char **argv)
{
GtkApplication *app; int status;
app = gtk_application_new ("org.gtk.listview", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv); g_object_unref (app);
return status;
}
[可怜的结果](https://i.stack.imgur.com/P8wKQ.png)
该程序编译时没有任何问题,但随后显示未定义的字符。 错误消息为:
a.out:13295):Pango-WARNING **:19:22:58.287:传递给 pango_layout_set_text() 的 UTF-8 字符串无效
有人知道吗,我在这里犯了什么错误?
答:
1赞
John
11/16/2023
#1
问题是您正在尝试在回调方法中显示 vs 从中获取值。GtkStringObject
bind_list_item_cb
static void bind_list_item_cb (GtkListItemFactory *factory, GtkListItem *list_item)
{
GtkWidget *label = gtk_list_item_get_child (list_item);
// get the string object from the model
GtkStringObject *str = gtk_list_item_get_item(list_item);
// extract the string value from the object
const char *string = gtk_string_object_get_string(str);
g_printerr("Item: %s \n", string);
gtk_label_set_text (GTK_LABEL (label), string);
}
评论