Capítulo II: Programa Gráfico en C++.


4 Interactuando... programación básica de Gtk.

Al utilizar Glade (próximamente), veremos que existen dos modos de programar. Uno que denominan básico y otro que denominan derivado (usando clases).
Consultando ejemplos de programación con gtkmm, no he encontrado ejemplo alguno de la programación básica, siempre han sido ejemplos usando clases,...
Sin embargo, para pequeños programas con Glade lo habitual es usar el modo básico.

Programación básica de Gtk:

En el capítulo anterior, vimos que no podíamos interactuar con el usuario modificando nuestra etiqueta (Gtk::Label), porque las funciones encargadas de gestionar las acciones del usuario no tenían conocimiento de la misma. Declararla como variable global, provoca errores en la ejecución, porque los objetos de Gtk tienen tamaños variables, requiriendo el uso de variables globales tipo puntero.

Veamos como hacerlo:
Práctica II-4: En Anjuta, crea un proyecto nuevo, selecciona programa proyecto Gtkmm 2.0 (por defecto el lenguaje de programación es  C++), como nombre practica_II_4  (o el que se te antoje).

Recuerda que dará error al generar el proyecto. Edita el archivo configure en la carpeta correspondiente /home/[usuario]/Projects/practica_II_4 y reemplaza las alusiones a gtkmm-2.0 por gtkmm-2.4 (que es la librería que nosotros hemos instalado).

Si al generar el proyecto no te aparece el archivo main.cc, sino otros distintos (nombre_programa.cc, windows1.cc, windows1.hh, windows1_glade.cc,  windows1_glade.hh ) tienes instalado el programa glademm que genera dichos archivos.  
Para seguir las siguientes instrucciones deberías desinstalarlo (provisionalmente).

Modificamos el archivo de main.cc para que quede tal que así:
/* *************************
 *    MAESTRODENADA.COM      *
 *        presenta         *
 *           el            *
 *      programa básico    *
 *       con Gtk           *
 ***************************/

#include <iostream>
#include <gtkmm.h>

Gtk::Label* etiqueta;
int veces=0;
void pulsar_boton();

int main(int argc, char *argv[])
{  
   
    Gtk::Main programa(argc, argv); // Creación del proceso gráfico

    // Diseño del entorno gráfico, declaración de componentes
    Gtk::Window miventanica;
    Gtk::VBox principal;
    Gtk::HSeparator linea;
    Gtk::Label etiqueta2 ("Pulsa en el botón de abajo");
    Gtk::Button contador("¡AQUÍ!");

    // Diseño del entorno gráfico, composición de componentes
    miventanica.add(principal);
    
    principal.pack_start(etiqueta2);
    principal.pack_start(linea);
    principal.pack_start(contador);
   
    
// Diseño del entorno gráfico, hacer visibles los controles
    principal.show();
    etiqueta2.show();
     contador.show();   
    linea.show();
   
   
// Diseño del entorno gráfico, retoques
    miventanica.set_title("maestrodenada.com");
    miventanica.resize(260,110);

   
// Diseño del entorno gráfico, conexión señales con funciones
    
   
contador.signal_clicked().connect(sigc::ptr_fun(&pulsar_boton));


    etiqueta = &etiqueta2; // Inicialización de variables punteros

    Gtk::Main::run(miventanica); // lanzamiento/ejecución del proceso
   
    return 0;
}
void pulsar_boton()
{
    char h[30];
    sprintf (h, "Has pulsado %i veces el botón", ++veces);
    etiqueta->set_text(h);
       
}

Explicación:

Para manipular un control o componente de Gtk debemos realizar lo siguiente:
  1. Declarar variables GLOBALES punteros a los componentes que deseamos acceder, en nuestro caso un Gtk::Label.
  2. Asociar la variable puntero con el objeto a manipular, lo cual obliga a crear éste con anterioridad. En el ejemplo hemos asignado a etiqueta (variable puntero) la dirección de etiqueta2 (variable Label) usando el operador &. (Observa que en la función sigc::ptr_fun, también pasamos la dirección de pulsar_boton)
  3. Acceder a o manipular los elementos mediante el puntero (en la función que gestiona la señal).

Para acceder a los elementos hemos usado  ->
En C y C++, para acceder a los datos individuales de una variable de un objeto complejo (con varios datos), se utiliza el [.], tal y como se observa en main.
Sin embargo, en las variables puntero de objetos complejos, el acceso se realiza a través de ->.

Como curiosidad, decir que la instrucción: etiqueta->set_text(h);  es igual a (*etiqueta).set_text(h);
como comentamos en una variable puntero, * nombre_variable, devuelve el contenido al que apunta, por lo que (*etiqueta) devuelve un objeto Gtk::Label, con el punto accedemos a la función del objeto Gtk::Label devuelto.
Es fácil, y con Glade más, sin embargo lo habitual en los ejemplos de programación con gtkmm es utilizar un método más propio de C++, usar clases
Interactuando...programación con clases de Gtk
Inicio