2014-01-29 10 views
1

여기 내 첫 번째 게시물입니다. 우선 나는 가난한 영어에 대해 사과하고 싶다. 나는 정말로 내가 당신이 말하는 것을 이해할 수 있기를 바랍니다.이미지가있는 버튼 - 이미지가 사라집니다.

이 좋아, 그래서 내 문제가있다 :

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에 의해 발생되는 것을 발견했다. 나는 다음에해야할 일을 모른다. 도움을 위해 미리 감사드립니다. 당신의 라인 당신이이 GtkWidget * 위젯을 사용하는

 gtk_button_set_image(widget, button_image); 

을에 따라서

+0

'i'의 값이 '이 GtkWidget * card_button [I]의 시점에서 무엇;'은? 나는'i'가'board_2'이어야한다고 생각합니다. – unwind

+0

맞습니다 - 오타입니다. 내 소스 파일에서 올바르게'GtkWidget * card_button [board_2];로 선언해야한다. – SirPL

답변

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); 
} 
0

하지만 gtk_button_set_image 기대 :

그래서
void gtk_button_set_image (GtkButton *button, GtkWidget *image); 

당신이 그것을 캐스팅을 시도 할 수 있습니다 (GtkButton가 hierachy에서 위젯 이하이어야한다)

gtk_button_set_image((GtkButton *)widget, button_image); 

또는 GtkWidget 대신 버튼으로 넘기십시오. 오류 메시지가 잘못된 유형을 사용하고 있음을 알려줍니다.

+0

아니, 불행히도 도움이되지 않는다. 이미지가 사라질 때 터미널 오류 메시지가 나타나지 않습니다. ... – SirPL

+0

항상 같은 이미지입니까, 사라지거나 임의의 이미지입니까? – ikstream

+0

음 ... 버튼을 누르면 이미지가 사라집니다. 다음에 "클릭"이 사라지기 바로 전에 클릭했습니다. 예를 들어 : 버튼 3에서 4 => 사라진 이미지를 클릭하면 버튼 1, 2, 3, 4 및 이미지가 사라졌습니다. 6 개의 클릭 된 버튼마다 이미지가 사라지는 것으로 나타났습니다. – SirPL

관련 문제