Manual
logo



Programación C++ con AGU desde 0

Añadiendo Componentes: los contenedores

La función add de Gtk::Window nos ha permitido añadir el componente Label o etiqueta en el programa anterior. Quizás estemos tentados en añadir otro componente (por ejemplo, un botón Gtk::Button) añadiendo las siguientes líneas de código a nuestro programa:

#include <gtkmm.h>
#include <glib.h>

int  main(int argc, char *argv[])

    GString * mensaje;
    mensaje = g_string_new( "Hola ");
    if (argc>1)
    {
        g_string_append(mensaje, argv[1]);
    }else{
        g_string_append (mensaje, "DESCONOCIDO");
    }
  
  
    Gtk::Main programa(argc, argv);

    Gtk::Window miventanica;

    Gtk::Label etiqueta(mensaje->str);
    miventanica.add(etiqueta);
    etiqueta.show();  

    miventanica.set_title("maestrodenada.com");
   
    Gtk::Button contador("pulsame");
    miventanica.add(contador);
    contador.show();

    Gtk::Main::run(miventanica);// Echar a correr nuestra ventana
  
    return 0;
}


El programa compila y se ejecuta, pero sin aparecer el botón. Y en el terminal, nos aparece un mensaje de advertencia, indicándonos que el Gtk::Window solo admite un widget...¡qué decepción! pues rara vez un programa tendrá sólo un componente.
Esto es así, porque Gtk::Window está desarrollada como un contenedor simple, sólo admite un widget [heredan de Gtk::Bin la función add() y remove(), para añadir y quitar el widget].
Para poder realizar ventanas con varios componentes, Gtkmm tiene implementados unos widget que admiten varios widgets: los contenedores.
Para añadir controles en estos contenedores, se utiliza la función pack_start() [no add()].
Esto es, para realizar algo como esto:

Vamos a añadir a Gtk::Window un widget que permita añadir a su vez varios widgets, será el Gtk::VBox , con la función add().
En este VBox (caja vertical) vamos a añadir tres elementos- con pack_start() -, un widgets etiqueta (Gtk::Label), una línea separadora (Gtk::HSeparator) y un botón (Gtk::Button).

#include <gtkmm.h>

int main(int argc, char *argv[])

  
    Gtk::Main programa(argc, argv);

    // declarando todo lo que hace falta
    Gtk::Window miventanica;
    Gtk::VBox principal;
    Gtk::HSeparator linea;
    Gtk::Label etiqueta("Pulsa abajo");
    Gtk::Button contador("¡AQUÍ!");

    // añadimos el VBox al Window
    miventanica.add(principal);
  
    // añadiendo nuestros elementos al VBox
    principal.pack_start(etiqueta);
    principal.pack_start(linea);
    principal.pack_start(contador);
  
    // haciéndolo todo visible
    principal.show();
    etiqueta.show();
     contador.show();  
    linea.show();
  
    miventanica.set_title("maestrodenada.com");
    miventanica.resize(260,110);
  

    Gtk::Main::run(miventanica);
  
    return 0;
}