带图像的按钮 - 图像消失

时间:2014-01-29 14:19:57

标签: c button gtk

这是我在这里发表的第一篇文章。首先,我想为我可怜的英语道歉。我真的希望你能理解我想说的话。

好的,这就是我的问题:我在循环中生成了几个按钮:

int board = 4;
int board_2 = board*board;
GtkWidget *card_button[board_2];

char path[100];
sprintf(path,"res/0.png"); //path to default image
GtkWidget *button_image = gtk_image_new_from_file(path);

for(int i=0; i<board_2; i++)
{
    card_button[i] = gtk_button_new();
    gtk_button_set_image(card_button[i],button_image);
    gtk_grid_attach(GTK_GRID(grid),card_button[i],i%board,(i/board)+1,1,1);
    g_signal_connect(G_OBJECT(card_button[i]), "clicked", G_CALLBACK(game_engine), i);
}

game_engine功能:

void game_engine(GtkWidget* widget, gpointer data)
{
    int button_id = (int)data;
    char path[30];
    sprintf(path,"res/%d.png",button_id);
    GtkWidget *button_image = gtk_image_new_from_file(path);
    gtk_button_set_image(widget, button_image);
}

当我点击按钮时,一切似乎都没问题(图像显示在按钮上),但有时,除了在点击按钮上显示图像外,另一个图像消失。此外,GTK在控制台上显示以下错误:

(Program.exe:4920): Gtk-CRITICAL **: gtk_widget_get_parent: assertion 'GTK_IS_WIDGET (widget)' failed

我做了一些debbuging,发现这个错误是由game_engine函数中的gtk_button_set_image引起的。我不知道接下来该做什么。 提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我找到了解决方案。为避免丢失图像,我不得不使用g_object_ref(button_image); 所以有正确的代码:

void game_engine(GtkWidget* widget, gpointer data)
{        
    int button_id = (int)data;
    char path[30];
    sprintf(path,"res/%d.png",field[button_id].val);
    GtkWidget *button_image = gtk_image_new_from_file(path);
    g_object_ref(button_image);
    gtk_button_set_image(GTK_BUTTON(widget),button_image);
}

答案 1 :(得分:0)

所以在你的行上

     gtk_button_set_image(widget, button_image);

您使用的是GtkWidget *小部件,但gtk_button_set_image需要:

    void gtk_button_set_image (GtkButton *button, GtkWidget *image);

所以你可以尝试施放它(GtkButton应该在下面的小部件中)

    gtk_button_set_image((GtkButton *)widget, button_image);

或将其交给按钮而不是GtkWidget。 您的错误消息只是告诉您,您使用了错误的类型