You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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):
    1. 第一个参数:触发信号的GObject(此处为DropDown)
    2. 第二个参数:描述被通知属性的GParamSpec对象(你错误地将它当成了传入的Label)
    3. 第三个参数:调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 04:43:09