“delete-event”信号的回调函数传递不正确的变量值

问题描述 投票:1回答:1

每当我将一些东西传递给回调函数时触发"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();
}

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

c gtk gtk3
1个回答
2
投票

您的信号处理程序不是"delete-event"的正确类型。 The reference manual为GTK3指定它需要:

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

你的显然不是那样的。结果可能是一堆未定义的行为。你看到的腐败数据可能是GdkEvent作为int的双打。尽管框架期望你的函数返回一些东西,你也不会返回任何值。

由于G_CALLBACK是一个强制转换器,然后框架会回转到它所期望的函数指针类型,因此您必须养成阅读手册以获取所连接信号的习惯。这里没有类型安全性,编译器无法捕获这些类型的错误。

© www.soinside.com 2019 - 2024. All rights reserved.