GObject 如何将参数传递给信号

GObject how to pass argument to signal

好的,所以我有一个自定义 GObject 来处理输入事件,以通知连接的处理程序我在 class_init_function:

中创建了一个信号
static void sample_input_manager_class_init (SampleInputManagerClass *klass)
{
  sample_input_manager_signals[KEY_EVENT] = g_signal_new(
    "key-event",
    G_TYPE_FROM_CLASS(klass),
    G_SIGNAL_RUN_LAST,
    0,
    NULL,
    NULL,
    NULL,
    G_TYPE_NONE,
    1,
    G_TYPE_INT /* Keycode */
  );
}

可能有用(在源文件的顶部):

enum SAMPLE_INPUT_MANAGER_SIGNALS
{
  KEY_EVENT = 0,

  N_SIGNALS
};

static guint ssample_input_manager_signals[N_SIGNALS] = { 0 };

现在,我想通过以下调用触发信号:

int key = 42;
g_signal_emit(manager, sample_input_manager_signals[KEY_EVENT], 0, key);

(其中 manager 是一个有效实例,key 是一个表示字符的整数)但是,在我注册的回调(g_signal_connect)中,我得到完全随机的值,如 -2073417152(对于任何输入整数,运行时常量)

我是否遗漏了任何让它工作的东西?


编辑 #1:

信号处理程序连接:

SampleInputHandler *input = sample_input_handler_new();
g_signal_connect(input, "key-event", G_CALLBACK(test_cb), NULL);

回调:

void testcb(int key, gpointer data)
{
  printf("(%d)",key);
}

解决方案

好的,所以在 too-long 时间之后,我认为 GLib 中的默认回调签名与此类似:

<ReturnType> callback (YourType *object[, <your arguments> ], gpointer data);

所以在我的问题中我只是忘记了第一个参数,所以我实际上没有读取我的整数,而是读取了我的对象的内存指针地址。