我想使用 g_signal_connect()
函数来更改特定 struct/class
中的数据。因此,在我看来,最好的方法是使用指向 struct
的指针。问题是指针的信息似乎一直在变化。
我花了很多时间弄清楚为什么会这样,但我不知道。 我可以毫无错误地编译和运行代码,但输出总是不同。
后来想用几个event_box连接一个struct的数组或者一个class的数组(event_box[0]
连接data[0]
,. ..).
我希望有人明白我的意思,我很乐意提供任何帮助。
#include<gtk/gtk.h>
struct d
{
bool status;
int ID;
};
void end_program(GtkWidget *wid, gpointer ptr)
{
gtk_main_quit();
}
void box_click(GtkWidget *wid, gpointer user_data)
{
struct d *data = (struct d*)user_data;
printf("status = %i\n", data->status);
printf("ID = %i\n", data->ID);
}
int main (int argc, char *argv[])
{
struct d data;
data.status = 0;
data.ID = 1;
gtk_init(&argc, &argv);
GtkWidget *win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
GtkWidget *event_box = gtk_event_box_new();
g_signal_connect(G_OBJECT(event_box), "button_press_event", G_CALLBACK(box_click), &data);
gtk_container_add(GTK_CONTAINER(win), event_box);
gtk_widget_show_all(win);
g_signal_connect(win, "delete_event", G_CALLBACK(end_program),NULL);
gtk_main();
return 0;
}
如果我多次点击该框,输出:
status = 4
ID = 32193184
status = 5
ID = 32193184
status = 4
ID = 32193184
status = 6
ID = 32193184
status = 4
ID = 32193184
最佳答案
I hope someone understands what I mean and I would be happy about any help.
嗯,是的.. 您为 button-press-event
使用了错误的函数原型(prototype)。 button-press-event
的原型(prototype)是:
The “button-press-event” signal
gboolean
user_function (GtkWidget *widget,
GdkEvent *event,
gpointer user_data)
(注意信号是 "button-press-event"
而不是 "button_press_event"
,尽管有一个 #define
允许第二种形式工作)
参见 GtkWidget (Gtk+3 Manual) .所以你的函数应该是这样的:
gboolean box_click(GtkWidget *wid, GdkEvent *event, gpointer user_data)
{
struct d *data = user_data; /* no need for cast, gpointer is void* */
g_print("status = %d\n", data->status);
g_print("ID = %d\n", data->ID);
return TRUE; /* to prevent further handling, FALSE otherwise */
(void)wid; /* cast to void to avoid unused var warning */
(void)event;
}
额外尼特
使用g_print
代替printf
,使用gboolean
代替bool
。虽然传递 address of
对于小型结构没问题,但对于大型结构,您应该使用 g_slice_new
进行分配。
关于c - signal_connect 函数中的指针工作不正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56610208/