【问题标题】:gtk 3.0 use the same callback for several switchesgtk 3.0 对多个开关使用相同的回调
【发布时间】:2022-01-06 14:44:00
【问题描述】:

我正在使用 GTK3.0 和 C 创建一个 Linux GUI,并且我想对多个开关使用相同的回调。为了区分被点击的开关,我尝试在 g_signal_connect 中使用 gpointer 参数,但回调似乎没有收到正确的值。

我以这种方式创建信号:

g_signal_connect(led1_switch, "state-set", G_CALLBACK(on_gpio_btn_click), (gpointer)"LED1");
g_signal_connect(led2_switch, "state-set", G_CALLBACK(on_gpio_btn_click), (gpointer)"LED2");

并且回调试图让 gpointer 传递:

    static void on_gpio_btn_click(GtkWidget *wid, gpointer ptr)
    {
        int gpio;
        int val = 0;
        char *gpio_switch = ptr;
...

但是当我调试应用程序时,ptr 指针的值为 0x1,这是一个错误的内存地址。

不应该指向存储常量字符串“LED1”的内存地址吗? 我究竟做错了什么?如何为多个小部件共享相同的回调?我有 8 个开关来控制 GPIO,我宁愿为所有这些开关设置一个回调,而不是创建八个。

【问题讨论】:

    标签: linux gtk gtk3


    【解决方案1】:

    您的函数签名是错误的:第二个参数是开关状态的值,可以在documentation of the "state-set" signal 中找到。这也是为什么值为1的原因:这就是TRUE的实际值。

    换句话说,你的回调会是这样的:

        static void on_gpio_btn_click(GtkSwitch *swtch, gboolean state, gpointer ptr)
        {
            int gpio;
            int val = 0;
            char *gpio_switch = ptr;
            // ...
        }
    

    【讨论】:

    • 感谢 nielsdg,它现在正在工作。我是 gtk 的新手,我假设函数签名是正确的,因为编译器没有抱怨,如果函数签名不是它所期望的,编译不应该失败吗?
    • 注意:使用 Gtkmm(GTK 的 C++ 绑定),编译器会报错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多