Indice

Una classe di esempio con Gtkmm

Autore: Fabio Di Matteo
Ultima revisione: 15/02/2008

“gtkmm è l'interfaccia C++ ufficiale del popolare toolkit grafico GTK+. Include le typesafe callback e un completo set di widget facilmente estendibili grazie all'ereditarietà.”
Da Wikipedia, l'enciclopedia libera.

Cosa otterremo

Creeremo una finestra che sarà in grado di lanciare un'applicazione scrivendo semplicemente il nome della stessa sulla casella di testo.
Faremo tutto questo grazie a due file: main.cc contenente il blocco principale del programma main_window.cc la classe che disegna l'interfaccia.

la main

#include <gtkmm/main.h>
#include "main_window.cc"
 
int main(int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);
 
  MainWindow window1;
  Gtk::Main::run(window1);
 
  return 0;
}

La classe main_window

#include <iostream>
#include <gtkmm.h>
 
class MainWindow : public Gtk::Window
{
 
protected: //le dichiarazioni dei widget e i metodi callbacks come "protetti"
	Gtk::Fixed fisso;
	Gtk::Entry entry;
	Gtk::Button button1;
 
	void on_button1_clicked()
	{
		system(entry.get_text().c_str());
	}
 
public:
 
MainWindow() //nel costruttore disegnamo la finestra
{
	set_size_request(320, 240);
  	set_title("Esempio classe gtkmm");
 
	add(fisso); //contenitore che permette un posizionamento "al pixel" dei widget
	fisso.put(button1,160, 170); //posiziono i widget sul contenitore	
	fisso.put(entry,60, 140);
	entry.set_text("[inserisci comando]");
	button1.set_label("Esegui");
	show_all_children();
 
	//collego al click del bottone l'esecuzione del metodo on_button1_clicked()
	button1.signal_clicked().connect( sigc::mem_fun(*this,
              &MainWindow::on_button1_clicked) );
 
}
 
~MainWindow()
{
}
 
 
 
};

Il Makefile

CPP = g++ 
OPTS =  `pkg-config --cflags --libs gtkmm-2.4`  
 
 
all:
	$(CPP) main.cc -o main $(OPTS)
 
 
clean:
	rm main

Spezzare la classe in file di intestazioni e implementazione

Può essere utile dover spezzare la classe in due file con rispettivamente le intestazioni con i prototipi dei metodi e l'implementazione della classe stessa.
Di seguito i due file e il main.

Ci sono di differenze con il codice precedente solo per quanto riguarda il makefile che questa volta include esplicitamente la compilazione della classe con la riga$(CPP) main.cc main_window.cc -o main $(OPTS) che vedremo meglio in seguito.

La main

#include <gtkmm/main.h>
#include "main_window.h"
 
int main(int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);
 
  MainWindow window1;
  Gtk::Main::run(window1);
 
  return 0;
}

Il main_window.h

//avrei potuto usare solamente #include <gtkmm.h>
#include <gtkmm/button.h>
#include <gtkmm/window.h>
#include <gtkmm/fixed.h>
#include <gtkmm/entry.h>
 
 
class MainWindow : public Gtk::Window
{
public:
	MainWindow();
	virtual ~MainWindow();
	Gtk::Entry entry; //publica in quanto si potrà accedere al contenuto 
 
 
protected: //le dichiarazioni dei widget e i metodi callbacks come "protetti"
	Gtk::Fixed fisso;
	Gtk::Button button1;
 
	void on_button1_clicked();
 
 
};

main_window.cc

#include <iostream>
#include <gtkmm.h>
#include "main_window.h"
 
MainWindow::MainWindow() //nel costruttore disegnamo la finestra
{
	set_size_request(320, 240);
  	set_title("Esempio classe gtkmm");
 
	add(fisso);
	fisso.put(button1,160, 170);	
	fisso.put(entry,60, 140);
	entry.set_text("[inserisci comando]");
	button1.set_label("Esegui");
	show_all_children();
 
	//collego al click del bottone l'esecuzione del metodo on_button1_clicked()
	button1.signal_clicked().connect( sigc::mem_fun(*this,
              &MainWindow::on_button1_clicked) );
 
}
 
MainWindow::~MainWindow()
{
}
 
void MainWindow::on_button1_clicked()
{
	system(entry.get_text().c_str());
}

Il Makefile

CPP = g++ 
OPTS =  `pkg-config --cflags --libs gtkmm-2.4`  
 
 
all:
	$(CPP) main.cc main_window.cc -o main $(OPTS)
 
 
clean:
	rm main