«Hola mundo» en gtkmm

Ahora ha aprendido lo suficiente para ver un ejemplo real. De acuerdo con una antigua tradición de la informática, se introducirá la aplicación Hola Mundo en gtkmm:

Código fuente

File: helloworld.h (For use with gtkmm 3, not gtkmm 2)

#ifndef GTKMM_EXAMPLE_HELLOWORLD_H
#define GTKMM_EXAMPLE_HELLOWORLD_H

#include <gtkmm/button.h>
#include <gtkmm/window.h>

class HelloWorld : public Gtk::Window
{

public:
  HelloWorld();
  virtual ~HelloWorld();

protected:
  //Signal handlers:
  void on_button_clicked();

  //Member widgets:
  Gtk::Button m_button;
};

#endif // GTKMM_EXAMPLE_HELLOWORLD_H

File: main.cc (For use with gtkmm 3, not gtkmm 2)

#include "helloworld.h"
#include <gtkmm/application.h>

int main (int argc, char *argv[])
{
  Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");

  HelloWorld helloworld;

  //Shows the window and returns when it is closed.
  return app->run(helloworld);
}

File: helloworld.cc (For use with gtkmm 3, not gtkmm 2)

#include "helloworld.h"
#include <iostream>

HelloWorld::HelloWorld()
: m_button("Hello World")   // creates a new button with label "Hello World".
{
  // Sets the border width of the window.
  set_border_width(10);

  // When the button receives the "clicked" signal, it will call the
  // on_button_clicked() method defined below.
  m_button.signal_clicked().connect(sigc::mem_fun(*this,
              &HelloWorld::on_button_clicked));

  // This packs the button into the Window (a container).
  add(m_button);

  // The final step is to display this newly created widget...
  m_button.show();
}

HelloWorld::~HelloWorld()
{
}

void HelloWorld::on_button_clicked()
{
  std::cout << "Hello World" << std::endl;
}

Intente compilarla y ejecutarla antes de continuar. Debería ver algo así:

Figura 3-1Hello World

Fascinante, ¿verdad? Examinemos el código. Primero, la clase HelloWorld:

class HelloWorld : public Gtk::Window
{

public:
  HelloWorld();
  virtual ~HelloWorld();

protected:
  //Signal handlers:
  virtual void on_button_clicked();

  //Member widgets:
  Gtk::Button m_button;
};

Esta clase implementa la ventana «Hello World». Deriva de Gtk::Window y tiene un único Gtk::Button como miembro. Se eligió usar el constructor para realizar todo el trabajo de inicialización de la ventana, incluyendo establecer las señales. Aquí está, sin los comentarios:

HelloWorld::HelloWorld()
:
  m_button ("Hello World")
{
  set_border_width(10);
  m_button.signal_clicked().connect(sigc::mem_fun(*this,
    &HelloWorld::on_button_clicked));
  add(m_button);.
  m_button.show();
}

Tenga en cuenta que se ha usado una declaración de inicialización para darle al objeto m_button la etiqueta «Hello World».

A continuación, llamamos al método set_border_width() de la ventana. Esto establece el tamaño del espacio entre los lados de la ventana y el widget que contiene.

Luego, se le engancha un manejador de señales a la señal clicked de m_button. Esto imprime nuestro amigable saludo a stdout.

A continuación usamos el método add() de la ventana para situar el m_button en ella. (add() deriva de Gtk::Container, que se describe en el capítulo sobre widgets contenedores). El método add() ubica al widget en la ventana, pero no lo muestra. Los widgets de gtkmm siempre son invisibles cuando se crean: para mostrarlos, debe llamar a su método show(), que es lo que se hace en la siguiente línea.

Ahora eche un vistazo a la función main() del programa. Aquí está, sin comentarios:

int main(int argc, char** argv)
{
  Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");

  HelloWorld helloworld;
  return app->run(helloworld);
}

Primero, se instancia un objeto almacenado en un puntero inteligente RefPtr llamado app. Éste es del tipo Gtk::Application. Cada programa de gtkmm debe tener uno de estos. Le pasamos nuestros argumentos de línea de comandos a su método «create()». Toma los argumentos que quiere, y le deja el resto, como se ha descrito anteriormente.

A continuación, se crea un objeto de la clase HelloWorld, cuyo constructor no toma argumentos, pero todavía no es visible. Cuando se llama a Gtk::Application::run(), pasándole la ventana «helloworld», la muestra y comienza el bucle de eventos de gtkmm. Durante el bucle, gtkmm espera las acciones del usuario, y responde apropiadamente. Cuando el usuario cierre la ventana, «run()» retornará, haciendo que la última línea de nuestra función «main()» se ejecute. Entonces, la aplicación finalizará.