Hello World στη gtkmm

Έχουμε τώρα μάθει αρκετά για να κοιτάξουμε ένα πραγματικό παράδειγμα. Σύμφωνα με μια παλιά παράδοση της επιστήμης των υπολογιστών, θα εισάγουμε τώρα Hello World, στη gtkmm:

Source Code

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[])
{
  auto 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;
}

Δοκιμάστε να μεταγλωττίσετε και να το εκτελέσετε πριν να συνεχίσουμε. Θα πρέπει να δείτε κάτι σαν αυτό:

Φιγούρα 3-1Hello World

Αρκετά συναρπαστικό; Ας εξετάσουμε τον κώδικα. Πρώτα, την κλάση HelloWorld:

class HelloWorld : public Gtk::Window
{

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

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

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

Αυτή η κλάση υλοποιεί το παράθυρο "Hello World". Παράγεται από τη Gtk::Window και έχει ένα μοναδικό Gtk::Button ως μέλος. Έχουμε επιλέξει να χρησιμοποιήσουμε τον κατασκευαστή για να κάνει όλη την εργασία αρχικοποίησης για το παράθυρο, συμπεριλαμβανόμενης της ρύθμισης των σημάτων. Να το, με παράλειψη των σχολίων:

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

Σημειώστε ότι έχουμε χρησιμοποιήσει μια πρόταση αρχικοποίησης για να δώσουμε στο αντικείμενο m_button την ετικέτα "Hello World".

Έπειτα, καλούμε τη μέθοδο set_border_width() του παραθύρου. Αυτό ρυθμίζει τον χώρο μεταξύ των πλευρών του παραθύρου και του γραφικού συστατικού που περιέχει.

Έπειτα συνδέουμε έναν χειριστή σήματος στο m_button το σήμα του clicked (πατημένο). Αυτό εκτυπώνει τον φιλικό μας χαιρετισμό στην stdout (τυπική έξοδος).

Κατόπιν, χρησιμοποιούμε τη μέθοδο add() του παραθύρου για να βάλουμε στο παράθυρο m_button. (η add() έρχεται από το Gtk::Container, που περιγράφεται στο κεφάλαιο των γραφικών συστατικών περιέκτη.) Η μέθοδος add() βάζει το γραφικό συστατικό στο παράθυρο, αλλά δεν εμφανίζει το γραφικό συστατικό. Τα γραφικά συστατικά της gtkmm είναι πάντα αόρατα, όταν τα δημιουργείτε - για την εμφάνισή τους, πρέπει να καλέσετε τη μέθοδό τους show(), που είναι αυτό που κάνουμε στην επόμενη γραμμή.

Τώρα ας κοιτάξουμε στη συνάρτηση main() του προγράμματός μας. Να τη, χωρίς σχόλια:

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

Πρώτα, δημιουργούμε ένα αποθηκευμένο αντικείμενο στον έξυπνο δείκτη RefPtr που λέγεται app. Αυτό είναι του τύπου Gtk::Application. Κάθε πρόγραμμα της gtkmm πρέπει να έχει ένα από αυτά. Περνάμε τα ορίσματα της γραμμής εντολών μας στη μέθοδο της create(). Παίρνει τα ορίσματα που θέλει και σας αφήνει τα υπόλοιπα, όπως περιγράψαμε νωρίτερα.

Next we make an object of our HelloWorld class, whose constructor takes no arguments, but it isn't visible yet. When we call Gtk::Application::run(), giving it the helloworld Window, it shows the 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, run() will return, causing the final line of our main() function be to executed. The application will then finish.