2014-09-30 40 views
1

我想将对象传递给“clicked”事件的回调以设置目标标签的文本。如何将对象传递给GTK3回调函数?

这里是到目前为止我的代码:

#include <gtk/gtk.h> 

typedef struct { 
    int i; 
    GtkWidget *target; 
} Data; 

void change(GtkWidget *widget, 
      Data  *data) 
{ 
    gtk_label_set_text(GTK_LABEL(data->target), "it did!"); 
} 

int main(int argc, 
      char* argv[]) 
{ 
    gtk_init(&argc, &argv); 

    GtkWidget *window, *label, *button; 

    Data data; 
    data.i = 0; 
    data.target = label; 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title(GTK_WINDOW(window), "GTKdemo"); 
    g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL); 

    GtkGrid *grid = gtk_grid_new(); 

    button = gtk_button_new_with_label("Click here"); 
    g_signal_connect(button, "clicked", G_CALLBACK(change), &data); 
    gtk_grid_attach(grid, button, 0,0,1,1); 

    label = gtk_label_new("this will change"); 
    gtk_grid_attach(grid, label, 0,1,1,1); 
    gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(grid)); 

    gtk_widget_show_all(window); 

    gtk_main(); 

    return 0; 
} 

我正在尝试设置的label文被点击button时。 我试过gtk callback multiple arguments但没有骰子。帮帮我?

+0

该程序显示的按钮和标签很好,但当我点击按钮时崩溃。 'change()'里面有什么问题,我只是不知道是什么。 – clinei 2014-09-30 15:59:13

+0

我需要稍后通过对象提供其他数据。所以不使用对象不是一种选择。 – clinei 2014-09-30 16:02:23

回答

1

好吧,我通过移动data.target = label来修复它,在g_signal_connect之后执行按钮。 也许问题是在定义对象变量之前使用指针地址引起的。