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

GTK3.0 C开发多个开关共用同一回调函数无法正确接收自定义参数问题

问题修复方案

错误原因

GtkSwitch的state-set信号有固定的回调函数签名要求,你当前定义的回调参数数量不匹配,导致参数栈错位:

  • 你传入的字符串常量指针属于信号回调的第三个参数
  • 你当前写的双参数回调中,第二个gpointer ptr实际读取的是信号的第二个入参gboolean state(开关状态值,TRUE对应数值1,也就是你调试看到的0x1)

正确实现步骤

1. 修改回调函数签名

按照信号要求补全参数,即可正常拿到传入的自定义标识:

// state-set信号回调的标准原型:返回值为gboolean,参数依次为控件指针、目标状态、自定义用户数据
static gboolean on_gpio_btn_click(GtkWidget *wid, gboolean state, gpointer ptr)
{
    int gpio;
    int val = 0;
    const char *gpio_switch = ptr; // 此时ptr正常指向"LED1"/"LED2"常量字符串地址

    // 这里写你的GPIO控制逻辑,state参数就是开关要切换到的状态(TRUE=开,FALSE=关)

    // 返回值说明:返回FALSE表示你没有拦截状态修改,GTK会自动更新开关的UI显示;返回TRUE则GTK不会修改开关外观
    return FALSE;
}

2. 信号绑定代码无需修改

你之前的g_signal_connect写法完全正确,不需要调整。

可选优化方案

如果后续需要绑定更复杂的自定义数据,也可以通过GObject属性绑定的方式实现:

  • 绑定数据:g_object_set_data(G_OBJECT(led1_switch), "gpio_id", GINT_TO_POINTER(1));
  • 回调中读取:int gpio_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(wid), "gpio_id"));

内容的提问来源于stack exchange,提问作者jap jap

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:45:05