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:
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:
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 initialization 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 initializer 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.