【问题标题】:passing multiple values using GTK_SIGNAL_FUNC使用 GTK_SIGNAL_FUNC 传递多个值
【发布时间】:2014-02-25 11:20:16
【问题描述】:

当调用 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: assertion callback_func != NULL failedg_signal_connect_closure_by_id:assertion `closure != NULL' 失败

有没有其他方法可以通过小部件将多个值传递给事件函数。

【问题讨论】:

    标签: c gtk


    【解决方案1】:

    您正在做的是将调用 dropCoin() 的返回值用作函数指针。

    您绝不会告诉 GTK+ 它应该稍后调用带有指定参数的dropCoin():调用发生在gtk_signal_connect() 运行之前就在那里

    信号回调只有一个用户可设置的参数:gpointer user_data。您需要找到一种方法将所有您想要的数据与该单个指针相关联,通常通过分配一些内存来保存数据并将指针传递给该内存。在 C 中,这当然通常通过声明 struct,然后分配它的一个实例来完成。

    顺便说一句,您的代码使用的是旧版本的 GTK+,您应该考虑升级到 3.x。

    【讨论】:

    • 谢谢。我想我会先用 struct 试试运气。
    • @user3350708 我的意思是struct 当然,只是没有把它拼出来。我已经这样做了,现在。 :)
    【解决方案2】:

    您必须提供一个指向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);
        ...
    }
    

    【讨论】:

    • 我创建了一个名为 send_Data 的结构,其中包含其他结构和小部件,并将 send_Data 的地址作为 user_data 传递,现在让我感到困惑的一件事是,我如何在 dropCoin( ) 功能。我相信我不能通过取消引用来直接使用它。不知何故,我必须在 dropCoin() 中重新声明一个新结构并将其附加到 user_data 中?这是正确的方法吗?
    • 感谢您提供 dropCoin() 代码。至少我可以看到一些灯光。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 2013-02-03
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多