Hello World in gtkmm
| Chapter 3. Basics |

## Hello World in gtkmm

We've now learned enough to look at a real example. In accordance with an ancient tradition of computer science, we now introduce Hello World, a la gtkmm:

Source Code

File: `helloworld.h` (For use with gtkmm 4)

    #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();
      ~HelloWorld() override;

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

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

    #endif // GTKMM_EXAMPLE_HELLOWORLD_H

File: `helloworld.cc` (For use with gtkmm 4)

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

    HelloWorld::HelloWorld()
    : m_button("Hello World")   // creates a new button with label "Hello World".
    {
      // Sets the margin around the button.
      m_button.set_margin(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).
      set_child(m_button);
    }

    HelloWorld::~HelloWorld()
    {
    }

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

File: `main.cc` (For use with gtkmm 4)

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

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

      //Shows the window and returns when it is closed.
      return app->make_window_and_run<HelloWorld>(argc, argv);
    }

Try to compile and run it before going on. You should see something like this:

Figure 3.1. Hello World

Pretty thrilling, eh? Let's examine the code. First, the `HelloWorld` class:

    class HelloWorld : public Gtk::Window
    {
    public:
      HelloWorld();
      ~HelloWorld() override;

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

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

This class implements the "Hello World" window. It's derived from `Gtk::Window`, and has a single `Gtk::Button` as a member. We've chosen to use the constructor to do all of the initialisation work for the window, including setting up the signals. Here it is, with the comments omitted:

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

Notice that we've used an initialiser statement to give the `m_button` object the label "Hello World".

Next we call the Button's `set_margin()` method. This sets the amount of space around the button.

We then hook up a signal handler to `m_button`'s `clicked` signal. This prints our friendly greeting to `stdout`.

Next, we use the Window's `set_child()` method to put `m_button` in the Window. The `set_child()` method places the Widget in the Window.

Now let's look at our program's `main()` function. Here it is, without comments:

    int main(int argc, char* argv[])
    {
      auto app = Gtk::Application::create("org.gtkmm.example");
      return app->make_window_and_run<HelloWorld>(argc, argv);
    }

First we instantiate an object stored in a `Glib::RefPtr` smartpointer called `app`. This is of type `Gtk::Application`. Every gtkmm program must have one of these.

Next we call `make_window_and_run()` which creates an object of our `HelloWorld` class, shows that Window and starts the gtkmm event loop. During the event loop gtkmm idles, waiting for actions from the user, and responding appropriately. When the user closes the Window, `make_window_and_run()` will return, causing our `main()` function to return. The application will then finish.

Like the simple example we showed earlier, this Hello World program does not use the command-line parameters.

Mixing C and C++ APIs |  | Chapter 4. Changes in gtkmm 3