GTK4运行时错误:回调函数中设置Label文本失败求助
GTK4 DropDown回调参数错误导致断言失败的解决方法
编写了一个GTK4 C程序,包含DropDown和Label,绑定notify::selected-item信号的回调函数并传入Label作为用户数据,选择下拉选项时终端出现以下错误:
Selected item index: 1
(dropdown:7896): GLib-GObject-CRITICAL **: 16:52:49.770: invalid cast from 'GParamObject' to 'GtkLabel'
(dropdown:7896): Gtk-CRITICAL **: 16:52:49.771: gtk_label_set_text: assertion 'GTK_IS_LABEL (self)' failed
错误根源
notify::系列信号的回调函数签名和普通GTK信号不同:
- 普通信号(比如
destroy)的回调格式为(GtkWidget*, gpointer) - 但
notify::property-name信号的回调必须是(GObject*, GParamSpec*, gpointer):- 第一个参数:触发信号的GObject(此处为DropDown)
- 第二个参数:描述被通知属性的
GParamSpec对象(你错误地将它当成了传入的Label) - 第三个参数:调用
g_signal_connect时传入的用户数据(也就是你的Label)
你的回调函数错误使用了普通信号的签名,导致第二个参数被强制转为GtkLabel,触发断言失败。
修复代码
修改回调函数的签名和内部逻辑:
static void on_dropdown_changed(GObject *object, GParamSpec *pspec, gpointer user_data) { GtkDropDown *dd = GTK_DROP_DOWN(object); gint selected_idx = gtk_drop_down_get_selected(dd); printf("Selected item index: %d\n", selected_idx); // 获取选中的文本并更新Label GtkStringObject *selected_item = GTK_STRING_OBJECT(gtk_drop_down_get_selected_item(dd)); const gchar *selected_text = gtk_string_object_get_string(selected_item); gchar *label_text = g_strdup_printf("Selected: %s", selected_text); gtk_label_set_text(GTK_LABEL(user_data), label_text); g_free(label_text); }
g_signal_connect调用保持不变:
g_signal_connect(dropdown_str, "notify::selected-item", G_CALLBACK(on_dropdown_changed), lbl_choice);
额外说明
- 若不需要属性的详细信息,
GParamSpec*参数可以用(void)忽略,但必须保留参数位置 - 使用
gtk_drop_down_get_selected_item可直接获取选中的字符串对象,比仅获取索引更直观
内容的提问来源于stack exchange,提问作者LesFromIL
相关产品推荐
相关产品推荐

