无法将参数传递给GTK回调
Unable to pass argument to GTK callback
当程序最初运行时,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,对于确定事件是否传播非常重要
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 如何在 gtk+ c 中的回调之间进行通信
- 传递GTK回调时,请在C 中删除字符串向量
- 当通过代码触发回调时,抑制GTK信号
- 在 gtk 的回调函数中调用函数
- 如何在执行回调时隐藏顶级GTK窗口
- 无法将参数传递给GTK回调