c - signal_connect 函数中的指针工作不正常

标签 c pointers gtk3 gtkmm

我想使用 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/

相关文章:

python - 如何获取输入 gtk.entry 字段的值并在按钮信号之外使用它

c - 如何通过单击按钮退出 gtk 应用程序?

c - c 中的 karatsuba 实现

c++ - 双指针问题error passing through functions

c++ - 在 C++ 中指向 this 的指针

c - 添加指向字符的指针

python - 在带有菜单栏的窗口中使用 Gtk 播放视频

c - execvp 函数无需路径即可工作

c - PIC24FJ64GA002 中的可变 PWM 设置

在 C 中转换指针