Indice

Gtkmm: aprire una seconda finestra

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

Facendo riferimento all'articolo Una classe di esempio con Gtkmm vedremo come aggiungere un bottone alla fistra principale che servirà per mostrare una seconda finestra. Di seguito il codice completo dell'esempio. Ultilizzeremo 2 classi più il main per realizzare il tutto, e per comodità metteremo il tutto in 3 file distinti: main.cc , main_window.cc e secondary_window.cc .

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 MainWindow (main_window.cc)

#include <iostream>
#include <gtkmm.h>
#include "secondary_window.cc"
 
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;
	Gtk::Button button2;
 
 
	void on_button1_clicked()
	{
		system(entry.get_text().c_str());
	}
	void on_button2_clicked()
	{
		SecondaryWindow window2; //dichiaro la seconda finestra	
		window2.set_modal(true); //finestra modale 
		Gtk::Main::run(window2); //chiedo al ciclo principale di mostrarla.
 
                //quando chiude la nuova finestra prende alcuni dati
		set_title("Titolo finestra modale: " + window2.get_title());
		entry.set_text("Titolo finestra modale: " +window2.get_title());
 
                //invoco il distruttore della classe window2
                //così scarico dalla memoria la finestra e i suoi widget
		window2.~SecondaryWindow();
 
 
	}
 
public:
 
MainWindow() //nel costruttore disegnamo la finestra
{
	set_size_request(320, 240);
  	set_title("Esempio due finestre gtkmm");
 
	add(fisso);
	fisso.put(button1,160, 140);
	fisso.put(button2,160, 180);
 
	fisso.put(entry,60, 110);
	entry.set_text("[inserisci comando]");
	button1.set_label("Esegui");
	button2.set_label("Seconda finestra");
 
	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) );
	button2.signal_clicked().connect( sigc::mem_fun(*this,
              &MainWindow::on_button2_clicked) );
 
 
}
 
~MainWindow()
{
}
 
 
 
};

La classe SecondaryWindow (secondary_window.cc)

#include <iostream>
#include <gtkmm.h>
 
class SecondaryWindow : public Gtk::Window
{
 
protected: //le dichiarazioni dei widget e i metodi callbacks come "protetti"
	Gtk::Fixed fisso;
	Gtk::Button button1;
 
 
	void on_button1_clicked()
	{
		Gtk::Main::quit(); //chiude la finestra
		//exit (0);	   //chiude tutto il programma	
	}
 
public:
 
SecondaryWindow() //nel costruttore disegnamo la finestra
{
	set_size_request(320, 240);
  	set_title("Esempio due finestre gtkmm");
 
	add(fisso);
	fisso.put(button1,140, 110);
	button1.set_label("Chiudi !");
 
	show_all_children();
 
	//collego al click del bottone l'esecuzione del metodo on_button1_clicked()
	button1.signal_clicked().connect( sigc::mem_fun(*this,
              &SecondaryWindow::on_button1_clicked) );
 
}
 
~SecondaryWindow()
{
}
 
 
 
};