Manual
logo



Programación C++ con AGU desde 0

Glade Básico

Ahora vamos a realizar nuestro programa usando Glade.
Para ello, vamos  a editar nuestro archivo .glade. Podemos realizarlo con el interfaz de Anjuta, o abriendo el archivo con el programa Glade (Es mi opción preferida, porque así se ven todos los aspectos del programa):

Vamos a crear nuestra interfaz de forma visual.

En primer lugar, en la ventana de propiedades (abajo-derecha), vamos a cambiar las propiedades de main_window:
Nombre-> miventanica
Título-> maestrodenada.com
Luego en el lateral izquierdo, seleccionamos (clikamos) el contenedor VBox (línea roja fina) y pulsamos sobre la ventana gráfica. Nos pregunta por el número de filas, ¿? Como nosotros, le añadíamos tres cosas (tres pack_start), pues le decimos que tres (por defecto).
Abajo (aquí el orden no importa mucho) ponemos el botón. Pero voy a hacer un poco de trampa, voy a seleccionar una caja de botones horizontal (marco rojo grueso) y "cliko" sobre la zona inferior. A la pregunta que me realiza (nº de columnas) le voy a indicar que 1 (pues sólo quiero un botón). El botón sale centrado (colocación: default), pero podíamos optar por que estuviese desplazado (colocación:start o end). Luego Click sobre el control Button (línea azul gruesa) y pulsamos en la caja de botones. Editamos sus propiedades:
Nombre-> boton
etiqueta-> ¡AQUÍ!
Arriba el control Label (selección y pulsar sobre zona). En la ventana de propiedades, cambiamos:
Nombre-> etiqueta
etiqueta-> Pulsa el botón de abajo
Seleccionamos la línea horizontal y pulsamos en la zona media. Como no voy a modificar éste durante la programación, dejo los valores por defecto. ¡Ahh! lo que si voy a hacer es en la pestaña EMPAQUETADO del editor de propiedades, modificar la opción de expandir: para la etiqueta voy a poner sí y para la línea no. Varía el tamaño de la ventana y observa las diferencias (cuestión de gustos).

Nuestro main.cc:

#include <libglademm/xml.h>
#include <gtkmm.h>
#include <iostream>


#ifdef ENABLE_NLS
#  include <libintl.h>
#endif


/* For testing propose use the local (not installed) glade file */
/* #define GLADE_FILE PACKAGE_DATA_DIR"/basico/glade/basico.glade" */
#define GLADE_FILE "basico.glade"
Gtk::Label* etiqueta;
int veces=0;
void pulsar_boton();  
int
main (int argc, char *argv[])
{
    Gtk::Main kit(argc, argv);
   
    //Load the Glade file and instiate its widgets:
    Glib::RefPtr<Gnome::Glade::Xml> refXml;
    try
    {
        refXml = Gnome::Glade::Xml::create(GLADE_FILE);
    }
    catch(const Gnome::Glade::XmlError& ex)
    {
        std::cerr << ex.what() << std::endl;
        return 1;
    }
    Gtk::Window* mi_aplicacion;
        // Inicialización de mi_aplicacion
        refXml->get_widget("miventanica", mi_aplicacion);
        if (mi_aplicacion) {
                   // Declaración de boton
                   Gtk::Button* boton;
                    // Inicialización de boton
                   refXml->get_widget("boton", boton);
                   if (boton){
                                  boton->signal_clicked().connect(sigc::ptr_fun(pulsar_boton));
                                   // Inicialización de etiqueta      
                                   refXml->get_widget("etiqueta", etiqueta);
                                   if (etiqueta){
                                         // el programa se ejecuta si todo ha ido bien
                                         kit.run (*mi_aplicacion);
                                   }
                  }
        }
    return 0;
}
void pulsar_boton()
{
    char h[30];
    sprintf (h, "Has pulsado %i veces el botón", ++veces);
    etiqueta->set_text(h);
  
     
}
El archivo .glade puedes cambiarlo sin necesidad de recompilar el proyecto, puedes modificarlo y ejecutar el programa, ... mientras se mantengan los nombres de los widgets utilizados en el código, no ha de haber problemas. Si alguna vez las modificaciones realizadas en el archivo .glade, no se observan en la ejecución, quizás se deba al pequeño detalle de no haber grabado el programa.
Alguna vez me ha ocurrido que Anjuta se queda colgado en el proceso de carga si el proyecto contiene un Glade. La solución pasa por ir al Monitor del sistema y finalizar el proceso Anjuta; luego ir a /home/usuario/.Anjuta/session y borrar el archivo session. Volvemos a iniciar Anjuta y éste se ejecuta sin cargar ningún proyecto anterior. En  Recientes abrimos el proyecto y sin problemas.

Explicación

Lo único a destacar es el anidamiento de if (un if dentro de otro), para ir comprobando que los distintos punteros son asignados correctamente, antes de ejecutar el programa.
Observa nuevamente como a diferencia de programas anteriores, aquí ya todas las variables son puntero: etiqueta es global y boton es local.