2013-04-28 69 views
0

我想用按钮创建网格。当点击一个按钮时,我希望它改变颜色,根据按钮的当前状态,0或1被存储在一个数组中。用GTK按钮创建网格

现在我通过创建带有两个for循环(行和列)的按钮来完成此操作。 在for循环中;

/*Create an ID number for the button being created*/ 
btn_nr ++; 
char btn_nr_str[3]; 
sprintf(btn_nr_str,"%d",btn_nr); //convert nr to string 

/*Create button*/ 
button = gtk_button_new(); 

/* When the button is clicked, we call the "callback" function 
* with a pointer to the ID */ 
gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (callback)(gpointer) btn_nr_str); 

/* Insert button into the table */ 
gtk_table_attach_defaults (GTK_TABLE(table), button, col, col+1, row, row+1); 
gtk_widget_show (button); 

该回调函数;

void callback(GtkWidget *widget, gpointer nr) 
{ 
    GdkColor buttonColor; 
    gdk_color_parse ("black", &buttonColor); 
    gtk_widget_modify_bg (GTK_WIDGET(widget), GTK_STATE_NORMAL, &buttonColor); 
    g_print ("Hello again - %s was pressed\n", (char *) nr); 
} 

这些按钮是按想要的方式创建的,点击时会变成黑色。 但是,所有按钮都会打印上次创建的按钮ID。

如何传递正确的ID?

+0

您在'gtk_signal_connect'调用(缺少逗号)中有复制和粘贴问题。请在发布代码之前仔细检查,因为这会造成误解。 – ntd 2013-04-29 07:58:40

回答

2

您正在从外部(回调)的范围(for周期)访问本地数组(btn_nr_str)。这个想法是正确的(使用user_data),但实现不是。

对于您的具体情况,您可以使用GLib提供的type conversion macros。这意味着它们是出于这样的目的:

/* In the for cycle */ 
g_signal_connect(button, "clicked", G_CALLBACK(callback), GINT_TO_POINTER(btn_nr); 

/* In the callback */ 
gint btn_nr = GPOINTER_TO_INT(user_data); 

P.S:gtk_signal_connect已弃用年前。

+0

谢谢,我现在开始工作! – user2109682 2013-04-29 09:11:50