代码之家  ›  专栏  ›  技术社区  ›  Hanlon

“delete event”信号的回调函数传递了错误的变量值

  •  1
  • Hanlon  · 技术社区  · 6 年前

    当我把东西传递给回调函数时 "delete-event" 当窗口退出时,我发送的值将被损坏。

    例如,这里有一个小程序说明了这个问题:

    #include <gtk/gtk.h>
    
    void window_quit(GtkWidget *window, int *v) 
    {
            g_print("%d\n", *v);
            gtk_main_quit();
    }
    
    void normal_function(int *v) 
    {
            g_print("%d\n", *v);
    }
    
    int main(int argc, char **argv)
    {
            gtk_init(&argc, &argv);
            GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
            gtk_widget_show(window);
            int v = 5;
            normal_function(&v);
            g_signal_connect(window, "delete-event", G_CALLBACK(window_quit), &v);
            gtk_main();
    }
    

    如何在退出时调用函数并传递正确的值?顺便说一句,我对正常调用或其他信号调用的函数没有这个问题。

    1 回复  |  直到 6 年前
        1
  •  2
  •   StoryTeller - Unslander Monica    6 年前

    "delete-event" The reference manual 对于规定的GTK3,需要:

    gboolean
    user_function (GtkWidget *widget,
                   GdkEvent  *event,
                   gpointer   user_data)
    

    你的显然不是那样。结果很可能是一堆未定义的行为。你看到的腐败数据很可能是 GdkEvent 作为一个 int . 您也不会返回任何值,尽管框架希望您的函数返回一些内容。

    G_CALLBACK 是一个强制转换,然后框架将强制转换回它所期望的函数指针类型 命令 你养成了阅读手册的习惯,了解你所连接的信号。这里没有类型安全,编译器无法捕获这些类型的错误。