g_signal_connect 中的用户指针未正确传递

user pointer in g_signal_connect is not passed correctly

我有一个带量程的 gtk 秤,我的目标是捕捉用户从秤上释放点击的时间。 (value-changed 即使在滑块仍在变化时也会被调用,这就是为什么它在我的情况下没有用)。 所以我使用了 this 信号。 信号回调工作正常,当鼠标点击被释放时调用,问题是用户指针有点随机。并在每次通话时发生变化。 这是我的代码:


static gboolean callback(GtkWidget *widget, GdkEventButton event, gpointer data) {
  int *n = (int *)data;

  printf("Pointer: %p\n", n);
  printf("Value: %d\n", *n);
  return FALSE;
}

static void activate(GtkApplication *app, gpointer user_data) {
  GtkWidget *window;
  GtkWidget *button_box;
  GtkWidget *slider;

  int *n = malloc(sizeof(int));
  *n = 1000;
  printf("Initialized pointer: %p\n", n);

  window = gtk_application_window_new(app);
  gtk_window_set_title(GTK_WINDOW(window), "Window");
  gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);

  button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
  gtk_container_add(GTK_CONTAINER(window), button_box);

  gtk_widget_add_events(window, GDK_BUTTON_RELEASE_MASK);

  slider = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 0, 100, 1);
  g_signal_connect(slider, "button-release-event", G_CALLBACK(callback), n);
  gtk_container_add(GTK_CONTAINER(button_box), slider);

  gtk_widget_show_all(window);
}

输出为:

Initialized pointer: 0x5594c31e5de0
Pointer: 0x5594c30a3e40
Value: 7
Pointer: 0x5594c30a3e40
Value: 7
Pointer: 0x5594c30a3da0
Value: 7
Pointer: 0x5594c30a3b20
Value: 7
Pointer: 0x5594c30a3bc0
Value: 7
Pointer: 0x5594c30a3bc0
Value: 7
Pointer: 0x5594c30a3bc0
Value: 7
Pointer: 0x5594c30a3c60
Value: 7

如果我把n换成NULL也是这样:

g_signal_connect(slider, "button-release-event", G_CALLBACK(callback), NULL);

在应该 (nil)

时仍然传递随机指针

没有任何意义。

编辑:唯一的混乱函数是 main,这就是整个代码:

int main(int argc, char **argv) {
  GtkApplication *app;
  int status;

  app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
  status = g_application_run(G_APPLICATION(app), argc, argv);
  g_object_unref(app);

  return status;
}

我主要怀疑 GdkEventButton event 应该是 GdkEventButton *event

在 C(和 Gtk)中将完整结构作为参数传递是非常罕见的