Problema con GTK programando un buscaminas en c++

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!! :P :D
Dado que aparentemente te da igual una cosa que otra, te recomendaria que te iniciases en Qt, mejor.
Su API esta creada para C++ (GTK es para C, con bindings opcionales para C++), y es, en mi opinion, muchisimo mas clara y versatil que GTK.

No te puedo ayudar con lo tuyo, simplemente es un consejo.
JanKusanagi escribió:Dado que aparentemente te da igual una cosa que otra, te recomendaria que te iniciases en Qt, mejor.
Su API esta creada para C++ (GTK es para C, con bindings opcionales para C++), y es, en mi opinion, muchisimo mas clara y versatil que GTK.

No te puedo ayudar con lo tuyo, simplemente es un consejo.


Comenzaré a mirar Qt pues! Gracias por el comentario!

Aún así, si alguno sabe decirme porqué no funciona lo que tengo hecho, se lo agradecería mucho. Ya más que por nada es por cabezonería... después de tanto tiempo perdido, quiero saber al menos el motivo xD

Y como ya he dicho, muchas gracias!! :) :)

offtopic: Un fin del mundo bastante tranquilito al final! xD
¿A qué te refieres con "no funciona"? Eso, a priori, no parece que esté mal.

Por otro lado, utilizar Gtk desde C++ es bastante más simple con Gtkmm. No obstante, es posible usar Gtk directamente sin ningún problema.
Ferdy escribió:¿A qué te refieres con "no funciona"? Eso, a priori, no parece que esté mal.

Por otro lado, utilizar Gtk desde C++ es bastante más simple con Gtkmm. No obstante, es posible usar Gtk directamente sin ningún problema.


Es que por más que miraba, no encontraba gran cosa sobre Gtk en C++, y hasta que no lo tenía prácticamente todo hecho ya, no empecé a suponer que eso mismo era Gtkmm.

El problema que tengo es que cuando coloco los botones en la ventana desde la clase más externa (entiéndase por externa a la clase desde donde me creo la "ventanita" del interfaz gráfico), se colocan correctamente (mostrando un 1 o un 0 en función de si hay bomba o no). Ahora, cuando pulso el botón correspondiente, no me aparece un 1 o un 0 en función de si hay bomba o no, sino que más bien es aleatorio (incluso el mismo botón, se me ha llegado a cambiar de 1 a 0 y al reves cuando he pulsado varias veces).

Tenía puesto un cout para ver el valor que devolvía el "getBomba()" de dentro del callback, y aunque el que realiza la señal si lo hacia bien, al callback llegaban valores aparentemente aleatorios (o si en el connect pasaba el gpointer de alguna manera alternativa, aparecían valores del estilo: "24" para el primer botón, "48" para el segundo, "96" para el tercero... y así, hasta que en un botón volvía al 0 y empezaba de nuevo en los posteriores).

Ya digo que si alguien quiere más datos o probarlo el directamente, puedo pasar los ficheros. Seguramente haya cometido barbaridades en el código, pero funcionar, creo que si que debería funcionar :S.
Uhm... hace tiempo que no hago nada de Gtk+, pero juraría que ese callback no tiene la signatura correcta.

http://developer.gnome.org/gtk3/3.2/Gtk ... ress-event

- fer
Ferdy escribió:Uhm... hace tiempo que no hago nada de Gtk+, pero juraría que ese callback no tiene la signatura correcta.

http://developer.gnome.org/gtk3/3.2/Gtk ... ress-event

- fer


Supongo que lo dirás porque en mi "CALLBACK" no hay ningun "GdkEvent *event", no? Empecé haciéndolo así porque lo primero que vi por internet explicando como funcionaba, lo hacían sin el "evento". Luego me di cuenta de que "oficialmente" hay que hacerlo con el evento y lo volví a probar, y daba resultados diferentes a los anteriores, pero seguía sin funcionar como debería... Al final supongo que me pondré a mirar como funciona gtkmm (para ver como se hace todo con GTK, vamos), porque he probado en QT como se hace, y lo tengo todo ya más o menos montado y funcionando :).

Gracias por las respuestas y felices fiestas!! :):)

EDIT: Estoy mirando por encima el enlace y... te refieres a lo que te he dicho? o es porque pone que es "button-press-event" en lugar de "button_press_event"?
6 respuestas