Olá mundo em gtkmm

Agora já aprendemos o suficiente para dar uma olhada em um exemplo real. Conforme uma antiga tradição da ciência da computação, apresentaremos um Olá, mundo, à la gtkmm:

Código-fonte

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/main.h>

int main (int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);

  HelloWorld helloworld;
  //Shows the window and returns when it is closed.
  Gtk::Main::run(helloworld);

  return 0;
}

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;
}

Tente compilá-lo e executá-lo antes de continuar. Você deveria ver algo assim:

Figura 3.1 ‒ Olá, Mundo

Bem empolgante, hein? Vamos examinar o código. Primeiro, a classe 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 classe implementa a janela "Hello World". Ela é derivada de Gtk::Window e tem um único Gtk::Button como membro. Optamos por usar o construtor para fazer todo o trabalho de iniciação para a janela, incluindo a configuração dos sinais. Aqui está, com os comentários omitidos:

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();
}

Note que usamos uma declaração iniciadora para dar ao objeto m_button o rótulo "Hello World".

Em seguida, chamamos o método set_border_width() da janela. Isso define a quantidade de espaço entre as laterais da janela e o widget que ela contém.

Depois, associamos um manipulador para o sinal clicked de m_button. Ele emitirá nosso cumprimento amistoso para stdout.

Em seguida, usamos o método add() da janela para colocar o m_button nela (add() vem de um Gtk::Container, que é descrito no capítulo sobre widgets contêineres). O método add() põe o widget na janela, mas não o exibe. Os widgets gtkmm são sempre invisíveis ao serem criados: para exibi-los, você tem que chamar o método show(), que é o que fazemos na linha seguinte.

Agora vamos olhar para a função main() do nosso programa. Aqui está, sem os comentários:

int main(int argc, char** argv)
{
  Gtk::Main kit(argc, argv);

  HelloWorld helloworld;
  Gtk::Main::run(helloworld);

  return 0;
}

Primeiro, instanciamos um objeto chamado kit. Ele é do tipo Gtk::Main. Todo programa gtkmm deve ter um desses. Nós passamos nossos argumentos de linha de comando para o seu construtor. Ele pega aqueles que quiser/entende e deixa para você os demais, como descrevemos anteriormente.

Em seguida, fazemos um objeto da nossa classe HelloWorld, cujo construtor não recebe argumentos, mas ainda não está visível. Quando chamamos Gtk::Main::run(), lhe dando a janela helloworld, ele a exibe e começa o laço de eventos do gtkmm. Nos momentos de ociosidade do laço de eventos do gtkmm, ele espera por ações do usuário e os reponde apropriadamente. Quando o usuário fecha a janela, run() irá retornar, fazendo com que a última linha de nossa função main() seja executada. O aplicativo então termina.