创建并发出gtk信号

我正在尝试创建并发出GTK信号:

g_signal_new("child-finished", G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, // *** I think this is where I need to change it G_TYPE_NONE, 0); g_signal_connect(G_OBJECT(myWindow), "child-finished", G_CALLBACK(MyCallback), NULL); 

这是我发出信号的代码:

 gtk_signal_emit_by_name(referenceToMyWindow, "child-finished"); 

这是我处理信号的代码:

 void MyCallback(GtkWidget *w, GdkEvent *e) { // handler code here } 

当我运行代码时,我收到以下错误:

GLib-GObject-CRITICAL **:g _closure_ invoke:断言`closure-> marshal || closure-> meta_marshal’失败了

我知道它与将marshaller传递给g_signal_new函数有关,但我不知道编组器是什么,我无法理解文档 ,而且在线的例子很少。 如何声明和连接我自己的信号?

GObject库提供了一些内置的marshallers ,所以你的代码应该是:

 g_signal_new("child-finished", G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST, 0, NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); 

或者,如果您想要进行类型检查:

 g_signal_new("child-finished", G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST, 0, NULL, NULL, g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, GDK_TYPE_EVENT); 

必须存在信号处理程序的参数(对象本身是隐含的),因此请务必指定指针(如第一个示例中所示)或盒装类型(如第二个示例中所示)。

如果您需要的编组器不存在于内置编组器中,您可以使用glib-genmarshal实用程序或直接自己编写代码(这非常简单,只需检查glib-genmarshal的输出)。