Stworzyłem sobie program który wyświetla główne okno GtkWindow w nim tablicę GtkTable następnie w tablicy wyświetlane są buttony GtkButton. I teraz chciałbym uzyskać efekt polegający na tym, że po kliknięciu w przycisk staje się on nieaktywny i wyświetla obrazek.
Tak wygląda moja funkcja zwrotna na sygnał clicked:
Czy zna ktoś poprawny i skuteczny sposób na umieszczenie obrazka w przycisku? I czy mój sposób na dezaktywowanie przycisku (czyli funkcja gtk_widget_set_sensitive) jest dobry?
Do ustawiania obrazków na GtkButton jest gtk_button_set_image. gtk_widget_set_sensitive spowoduje wyłączenie i wyszarzenie przycisku (i zawartego w nim obrazka).
Aha dzięki właśnie wcześniej używałem gtk_button set_image, ale obrazek był wyszarzony i myślałem że to ta funkcja to robi. Czy jest więc sposób na dezaktywowanie przycisku bez wyszarzenia obrazka?
Doprowadzenie do wyłączenia przycisku bez wyszarzenia, to by była jakaś straszna walka z systemem (chyba, że się da, ale ja nie znalazłem). Pozostają opcje:
po wciśnięciu przycisku, jest on usuwany i na jego miejsce wstawiany obrazek
po wciśnięciu przycisku, jest ustawiany w nim obrazek, a następne wciśnięcia są w obsłudze przycisku ignorowane. (animacja wciskania przycisku nadal będzie działać)
OK, jeszcze jedna rzecz nie daje mi spokoju, mam tabelę załóżmy 4 * 4 i w każdym polu przycisk razem 16 przycisków.
Za pomocą pętli for tworze sobie przyciski, ale po uruchomieniu programu, obrazek widoczny jest tylko w ostatnim z nich (tym utworzonym jako ostatni - prawy dolny róg), a nie tak jak chce czyli w każdym buttonie. Dodam że obrazek to GtkWidget *image przechowywany jako zmienna globalna
GtkButton* button** ; ---- zmienna globalna.**
GtkWidget *image ----- zmiennna globalna
int create_buttons(void)
{
int i, j;
for(i=0; i
{
for(j=0; j
{
button[i][j] = gtk_button_new(); //utworzenie nowego przycisku
gtk_widget_set_size_request(GTK_WIDGET(button[i][j]), 50, 50); //ustawienie rozmiaru
gtk_button_set_image(GTK_BUTTON(button[i][j]), GTK_WIDGET(cross_image)); <-- PROBLEM
gtk_signal_connect(GTK_OBJECT(button[i][j]), "clicked", GTK_SIGNAL_FUNC(clicked), image);
//obsługa sygnału kliknięcia - zmiana na nieaktywny i wstawienie obrazka
gtk_table_attach_defaults(GTK_TABLE(table), button[i][j], j, j+1, i ,i+1); //wepchanie przycisku do tabeli
}
}
return 0;
}
Z tego co kojarzę jak działa GTK, obiekt może naraz znajdować się tylko w jednym kontenerze, w przypadku dodania do innego jest automatycznie usuwany ze starego (z pamięci, nie musi być to prawdą, ale coś takiego kojarzę oraz pasuje do opisu problemu). Musiałbyś mieć GtkImage dla każdego GtkButton.
W tabeli umieszczam GtkEventBoxy a w każdym z nich GtkImage. Chcę by po kliknięciu w EventBox została wywołana funkcja która zmieni obrazek za pomocą funkcji gtk_image_set_from_file(); Ale wyskakuje mi segmantation fault po kliknięciu.
int create_images(void)
{
int i, j;
for(i=0; i
for(j=0; j
{
image[i][j] = gtk_image_new_from_file("border.png"); //utworzenie obrazka - pobranie z pliku
event_box[i][j] = gtk_event_box_new(); //utworzenie Event Boxu dla obrazka by można go było kliknąć
gtk_container_add(GTK_CONTAINER(event_box[i][j]), image[i][j]); //umiesczenie obrazka w Event Boxie
gtk_table_attach_defaults(GTK_TABLE(table), GTK_WIDGET(event_box[i][j]), j, j+1, i, i+1); //wepchanie eventboxa do tabeli
//kliknięcie w EventBox zmienia jego obrazek (przekazanie obrazka jako dodatkowy parametr)
gtk_signal_connect(GTK_OBJECT(event_box[i][j]), "button_press_event", GTK_SIGNAL_FUNC(clicked), image[i][j]);
}
return 0;
}
void clicked(GtkWidget* widget, gpointer dane) //dane to obrazek z EventBoxa
{
gtk_image_set_from_file(GTK_IMAGE(dane) ,"cross.png");
}
Oczywiście image[][] i event_box[][] to tablice globalne.