使用GTK_SIGNAL_FUNC传递多个值

时间:2014-02-25 11:20:16

标签: c gtk

我正在尝试在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一起传递给事件函数。

2 个答案:

答案 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);
    ...
}