每当我在触发"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();
}
如何在退出时调用函数并传递正确的值?顺便说一句,对于正常调用的函数或其他信号,我没有这个问题。
答案 0 :(得分:2)
您的信号处理程序的类型不适用于"delete-event"
。 The reference manual对于GTK3指定必须为:
gboolean
user_function (GtkWidget *widget,
GdkEvent *event,
gpointer user_data)
您显然不是那样。结果可能是一堆未定义的行为。您看到的损坏数据很可能将GdkEvent
修剪为int
。尽管框架希望您的函数返回某些内容,但您也不会返回任何值。
由于G_CALLBACK
是强制类型转换,然后框架将强制类型转换回预期的函数指针类型,因此命令性是您习惯于阅读有关连接信号的手册的习惯。这里没有类型安全性,编译器无法捕获这些类型的错误。