我正在尝试在gtk_button单击事件调用时将多个值传递给函数。值是struct,int和gtk_image的类型。我有一组附加到表格的gtk图像。代码部分如下,
`
GtkWidget *coin[6][7];
....
for(i=0;i<6;i++){
for(j=0;j<7;j++){
coin[i][j] = gtk_image_new_from_file("CoinC.png");
gtk_table_attach_defaults (GTK_TABLE(boardTable), coin[i][j], j, j+1, t, t+1);
}
t-=1;
}
`
我已经创建了按钮来执行某些功能,并且在函数中涉及一些小部件设置属性。其中一个是我想根据下面的代码改变我的图像显示
gtk_image_set_from_file(coin[slot][b->heights[0]],"CoinB.png");
按钮的事件触发代码如下
gtk_signal_connect (GTK_OBJECT(button[0]), "clicked", GTK_SIGNAL_FUNC(dropCoin(b,0,coin)),NULL);
dropCoin函数如下所示
gint dropCoin(board_type *b, gint slot, GtkWidget *coin[6][7]){
if(cp(b)==PLAYER_ONE){
makeMove(b,slot);
gtk_image_set_from_file(coin[slot][b->heights[0]-1],"CoinB.png");
}else{
makeMove(b, getReasonedMove(b));
gtk_image_set_from_file(coin[slot][b->heights[0]-1],"CoinA.png");
}
return 0;
}
每当我编译并运行程序时,事件就会立即启动,而不会执行任何单击操作。当我尝试单击相同的按钮时,事件不会被触发。我还收到以下错误 g_cclosure_new:断言callback_func!= NULL失败和 g_signal_connect_closure_by_id:断言`closure!= NULL'失败
是否有其他方法可以将多个值与widget一起传递给事件函数。
答案 0 :(得分:0)
你正在做的是使用调用dropCoin()
作为函数指针的返回值。
您不会以任何方式告诉GTK +它应该稍后使用指定的参数调用dropCoin()
:在gtk_signal_connect()
运行之前,调用就在那里。< / p>
信号回调只有一个用户可设置的参数:gpointer user_data
。您需要找到一种方法将所有所需的数据与该单个指针相关联,通常是通过分配一些内存来保存数据并将指针传递给该内存。在C中,这当然通常通过声明struct
,然后分配它的实例来完成。
顺便说一句,您的代码使用的是旧版GTK +,您应该考虑升级到3.x.
答案 1 :(得分:0)
您必须提供指向GTK_SIGNAL_FUNC
的函数指针。你做的是调用 dropCoin
并将结果int传递给GTK_SIGNAL_FUNC
。
您的通话应该更像
gtk_signal_connect (GTK_OBJECT(button[0]), "clicked", GTK_SIGNAL_FUNC(dropCoin),NULL);
您只能传递一个参数,但是您可以将多个值包装到结构中并传递它。
更新
将使用您传递给gtk_signal_connect
struct send_Data {
board_type *b;
gint slot;
GtkWidget *coin;
};
struct send_Data arg;
gtk_signal_connect (GTK_OBJECT(button[0]), "clicked", GTK_SIGNAL_FUNC(dropCoin), &arg);
和dropCoin
定义为
void dropCoin(struct send_Data *arg){
...
// do something with arg
makeMove(arg->b, arg->slot);
foo(arg->b);
bar(arg->coin);
...
}