Buenas!
Hace como una semana o así, decidí aprender de una vez (o intentarlo) a trabajar con interfaces gráficas en C++, y estuve buscando información sobre el tema. Después de mucho mirar, vi que la pregunta del millón era básicamente si "GTK" o "QT", y al final me decidí por GTK.
También he visto que las mismas cosas las hacen de maneras diferentes, no se si es en función de si es en C o en C++, o cuál es el motivo.
Llegados a esto, estoy intentando hacer un buscaminas (por el simple hecho de aprender, más que por otra cosa), y me he montado una clase "casilla", una clase "tablero" y una clase "ventana". Todo esto funcionando bien en terminal.
Y ahora llegamos al problema: Las señales. Al principio, desde "ventana" conectaba cada botón con su respectiva función al hacer click, pero claro, necesitaba modificar los parámetros de cada casilla al pulsar el botón, así que he acabado decidiendo añadir el botón como un parámetro de "casilla" y conectando la señal en el mismo constructor de casilla... pero no hay manera de que funcione bien...
Por Internet he leído sobre usar los "gpointer", pero no consigo que funcionen como deberían. He probado usando todas las variaciones que se me han ocurrido, pero no consigo nada...
La parte importante del código, vendría a ser el "callback":
(...)
static gboolean separar (GtkWindow *widget, gpointer data) {
class casilla* prueba=(casilla*)data;
gtk_button_set_label(GTK_BUTTON(widget),((prueba->getBomba())?"1":"0"));
return false;
}
(...)
y el constructor:
(...)
casilla::casilla(bool b, bool m, bool o, bool s, int f, int c, int n, int nb, tablero *t, ventana *v) : bomba(b), marcada(m), oculta(o), seleccionada(s), fila(f), columna(c), nCasilla(n), nBombas(nb), tab(t), ven(v)
{
boton=gtk_button_new_with_label((getBomba()?"1":"0"));
gtk_widget_show(boton);
g_signal_connect (G_OBJECT (boton), "button_press_event", G_CALLBACK (separar), this);
}
(...)
¿No sería correcto hacer eso?¿Alguien sabe donde porque no funciona como debería? Si alguien quiere más código, que me lo diga... Le puedo pasar todos los ficheros xD. Es que empiezo a estar un poco estresado de no encontrar el problema... (y ya he visto que en este mismo foro hay un mensaje antiguo parecido, pero no he conseguido nada haciendo lo mismo que decían...).
También quiero decir que si alguien tiene alguna sugerencia de como se debería hacer mejor, que me lo diga, que soy todo oídos (no se de hecho si ésta manera de trabajar con las interfaces gráficas es la de C o la de C++, pero tampoco he encontrado nada realmente explicativo por Internet).
Muchas gracias y feliz final del mundo!!