无法将参数传递给GTK回调

Unable to pass argument to GTK callback

本文关键字:GTK 回调 参数传递      更新时间:2023-10-16

当程序最初运行时,print语句会打印与指针对应的有效十六进制代码。然而,当我在屏幕上单击,并通过"单击"回调调用handleClick方法时,0x0将打印到屏幕上。发生了什么?为什么我的董事会对象突然变为空?

#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include "board.h"
void printBoard(Board *board);
void handleClick(GtkWidget *widget, GdkEventButton *event, cairo_t *cr, gpointer data);
  gboolean draw_cb(GtkWidget *widget, cairo_t *cr, gpointer data)
  {
    Board *temp = (Board *)data;
    printf("%pn",temp);
    return TRUE;
  }
  void handleClick (GtkWidget *widget, GdkEventButton *event, cairo_t *cr, gpointer data)
  {
    Board *temp = (Board *)data;
    printf("%pn",temp);
  }
  void start(Board *newBoard)
  {
      GtkWidget *window;
      GtkWidget *da;
      GtkWidget *frame;
      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      char string[40];
      snprintf(string, sizeof(string), "Connect %d-%d",newBoard->k,newBoard->n);
      gtk_window_set_default_size (GTK_WINDOW(window), 400, 400);
      gtk_window_move(GTK_WINDOW(window), 100, 100);     
      g_signal_connect (GTK_WINDOW(window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
      da = gtk_drawing_area_new ();
      gtk_widget_set_size_request (da, 500, 500);
      frame = gtk_frame_new (NULL);
      gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
      gtk_container_add (GTK_CONTAINER (window), frame);
      gtk_container_add (GTK_CONTAINER (frame), da);
      gtk_widget_set_events (da, gtk_widget_get_events (da)
                     | GDK_BUTTON_PRESS_MASK);
      g_signal_connect (da, "draw",
              G_CALLBACK (draw_cb), newBoard);
       g_signal_connect (da, "button-press-event",
              G_CALLBACK (handleClick), newBoard);
      gtk_widget_show_all (window);
  }
根据参考手册,button-press-event信号处理程序的原型如下。
gboolean user_function (GtkWidget *widget,
                        GdkEvent  *event,
                        gpointer   user_data)

如果从handleClick函数中删除cairo_t *cr参数,则data即可。

正如Szilard所说,您为handleClick函数使用了错误的原型。

button-press-event信号处理器具有以下原型:

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

要修复您的错误,您需要:

  • 删除cairo_t *cr参数。它正在接收data的值
  • 修复event类型,该类型是GdkEvent *,而不是GdkEventButton *
  • 修复返回值,该值是布尔值,而不是void,对于确定事件是否传播非常重要