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.