IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ Discussion :

[gtkmm] fermer l'application


Sujet :

GTK+

  1. #1
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut [gtkmm] fermer l'application
    bonjour,

    j'essaye d'apprendre le gtkmm mais j'ai un petit soucis, comment je ferme l'application (signal delete-event ?) ? où est-ce que je passe des arguments aux callback ?

    voici le code (tout dans le main pour tester pour le moment) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    #include <iostream>
    #include <gtkmm.h>
     
    using namespace std;
    using namespace Gtk;
     
    void on_button_clicked()
    {
        cout << "Appui sur le bouton" << endl;
    }
     
     
    int main(int argc, char *argv[])
    {
    	Main kit(argc, argv);
     
    	Window window;
    	window.set_size_request(320, 240);
     
    	Gtk::Frame frame;
    	window.add(frame);
    	frame.set_label(" - frame - ");
    	frame.set_label_align(Gtk::ALIGN_LEFT, Gtk::ALIGN_TOP);
    	frame.set_shadow_type(Gtk::SHADOW_ETCHED_OUT);
     
    	VBox vbox(true,0);
    	frame.add(vbox);
     
    	Button bouton("bouton");
    	vbox.pack_start(bouton,true,true,0);
    	bouton.signal_clicked().connect(sigc::ptr_fun(&on_button_clicked));
     
    	Button bouton2("bouton");
    	vbox.pack_start(bouton2,true,true,0);
    	bouton2.signal_clicked().connect(sigc::ptr_fun(&on_button_clicked));
     
    	window.show_all();
     
    	kit.run();
     
    	return 0;
    }

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Points : 83
    Points
    83
    Par défaut
    Pour fermer t'as fenêtre principale, il suffit d'appeler la méthode hide() de Window.

    Sinon, moi je lance une fenêtre principale de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Gtk::Window window;
    Gtk::Main::run(window);
    Ce qui permet de quitter l'application quand la fenêtre est détruite.

    Si c'est dans ta méthode on_button_clicked() que tu veux fermer ta fenêtre, le plus simple et de créer ta classe fenêtre dérivée de Gtk::Window. Tu n'auras qu'à faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bouton.signal_clicked().connect(sigc::ptr_fun(&MaWindow::on_button_clicked));
    et ton callback :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void MaWindow::on_button_clicked()
    {
        cout << "Appui sur le bouton" << endl;
        hide();
    }
    Sinon il faut passer un argument avec sigc::bind.

  3. #3
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    j'ai modifié mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    /* g++ -o gtkmm gtkmm.cc `pkg-config gtkmm-2.4 --cflags --libs` */
     
    #include <iostream>
    #include <gtkmm.h>
     
    using namespace std;
    using namespace Gtk;
     
    class Fenetre : public Window
    {
    	private :
     
    		Window window;
     
    		static void on_button_clicked()
    		{
    		    cout << "Appui sur le bouton" << endl;
    		}	
     
    	public :
    		Fenetre()
    		{
    			window.set_size_request(320, 240);
     
    			VBox vbox(true,0);
    			window.add(vbox);
     
    			Button bouton("bouton");
    			vbox.pack_start(bouton,true,true,0);
    			bouton.signal_clicked().connect(sigc::ptr_fun(&on_button_clicked));
    		}
     
    		void montrer()
    		{
    			window.show_all();
    		}
     
    		~Fenetre()
    		{
    		}
    };
     
    int main(int argc, char *argv[])
    {
    	Main kit(argc, argv);
     
    	Fenetre fen;
    	fen.montrer();
     
    	Main::run(fen);
     
    	return EXIT_SUCCESS;
    }
    Concernant la fermeture ça marche, pour les arguments, je voudrait passé une autre classe que celle de ma fenêtre, c'est possible ?

    Enfin en passant ma fenêtre à Gtk::Main::run(), j'ai l'impression que le constructeur ne sert à rien.

    Enfin dans cette version du code, je n'ai plus le contenu de ma fenêtre.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Points : 83
    Points
    83
    Par défaut
    Ta méthode on_button_clicked n'a pas besoin d'être déclarée static, à moins que tu ne veuille l'appeler sans créer d'instance.

    Tu n'as pas besoin de déclarer un autre widget Window puisque ta classe hérite des propriétés de Window.

    Utilise la méthode show_all_children() pour afficher tous tes widgets en récursif.

    De plus ton bouton est déclaré en local, dans ton constructeur, il sera donc détruit à la fin de ton constructeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    /* g++ -o gtkmm gtkmm.cc `pkg-config gtkmm-2.4 --cflags --libs` */
     
    #include <iostream>
    #include <gtkmm.h>
     
    using namespace std;
    using namespace Gtk;
     
    class Fenetre : public Window
    {
    	private :
                    Button m_button;
    		void on_button_clicked()
    		{
    		    cout << "Appui sur le bouton" << endl;
    		}	
     
    	public :
    		Fenetre():m_button("bouton")
    		{
    			set_size_request(320, 240);
     
    			VBox vbox(true,0);
    			add(vbox);
     
    			vbox.pack_start(bouton,true,true,0);
    			bouton.signal_clicked().connect(sigc::ptr_fun(&on_button_clicked));
                            show_all_children();
    		}
     
    		~Fenetre()
    		{
    		}
    };
     
    int main(int argc, char *argv[])
    {
    	Main kit(argc, argv);
     
    	Fenetre fen;
    	Main::run(fen);
     
    	return EXIT_SUCCESS;
    }
    pour les arguments, je voudrait passé une autre classe que celle de ma fenêtre, c'est possible ?
    Que veux-tu faire exactement ?

    Enfin, je te conseil de séparer tes déclarations de ton implémentation (.h .cpp).

  5. #5
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    j'ai le code (ça doit être à peu prés le même que celui d'Anium) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    /* g++ -o gtkmm gtkmm.cc `pkg-config gtkmm-2.4 --cflags --libs` */
     
    #include <iostream>
    #include <gtkmm.h>
     
    using namespace std;
    using namespace Gtk;
     
    class Fenetre : public Window
    {
    	private :
    		Button bouton;
     
    		static void on_button_clicked()
    		{
    		    cout << "Appui sur le bouton" << endl;
    		}	
     
    	public :
    		Fenetre() : bouton("click me !")
    		{
    			set_size_request(320, 240);
     
    			VBox vbox(true,0);
    			add(vbox);
     
    			vbox.pack_start(bouton,true,true,0);
    			bouton.signal_clicked().connect(sigc::ptr_fun(&on_button_clicked));
    		}
     
    		void montrer()
    		{
    			show_all_children();
    		}
     
    		~Fenetre()
    		{
    		}
    };
     
    int main(int argc, char *argv[])
    {
    	Main kit(argc, argv);
     
    	Fenetre fen;
    	fen.montrer();
     
    	Main::run(fen);
     
    	return EXIT_SUCCESS;
    }
    Toujours le problème du bouton qui n'apparait pas.

    Concernant le passage par paramètre, je voudrait par exemple passé une structure déclaré dans le main (elle passerait via le constructeur de Fenetre() puis les méthodes).

    ma méthode est static parce que sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function.  Say «&Fenetre::on_button_clicked»
    Enfin concernant les .hpp ... ce code est juste pour apprendre les quelques base donc un .cc suffit pour le moment.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Points : 83
    Points
    83
    Par défaut
    Ton bouton n'apparait pas parce que ta VBox est en local aussi, il faut la déclarer en dehors de ton constructeur, comme pour ton bouton.

    Sinon, en enlevant ton static et en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bouton.signal_clicked().connect(sigc::ptr_fun(&Fenetre::on_button_clicked));
    Ça ne résout pas le problème ?

    Pour ton passage par paramètre, tu peux bien sur passer n'importe quoi par le constructeur, ou même par une méthode set qui initialisera un champs privé de ta classe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void Fenetre::set_value(Type value){
       m_value = value;
    }
    Tu pourras déclarer ce champs dans ton .h de ta classe et ainsi tes méthodes pourront y accéder.

    Par contre, si tu compte modifier ce champs et qu'il le soit aussi dans ton main, il faudra le passer soit par référence, soit par pointeur.

  7. #7
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    Pour le bouton c'est bon, c'était tout bête

    Par contre le signal me donne toujours l'erreur.

    Concernant le passage de paramètre, si je comprend bien ça ne sert à rien vu qu'on a tout dans la classe, mais alors à quoi servent les :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bouton.signal_clicked().connect(sigc::mem_fun(*this,&on_cliquer));

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Points : 83
    Points
    83
    Par défaut
    En déclarant dans des .h et .cpp, tu ne devrais pas avoir de problèmes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bouton.signal_clicked().connect(sigc::mem_fun(*this,&on_cliquer));
    Cela permet, tout comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bouton.signal_clicked().connect(sigc::ptr_fun(&Fenetre::on_button_clicked));
    de connecter un signal sur ton bouton, la méthode on_cliquer() sera appelé lors d'un clic sur le bouton.

    J'avoue que la différence entre ces deux méthodes m'est flou. D'après la doc :
    mem_fun()
    mem_fun() is used to convert a pointer to a method to a functor.
    ptr_fun()
    ptr_fun() is used to convert a pointer to a function to a functor.
    A approfondir...

  9. #9
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    .hh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <iostream>
    #include <gtkmm.h>
     
    using namespace std;
    using namespace Gtk;
     
    class Fenetre : public Window
    {
    	private :
    		Button bouton;
    		VBox vbox;
     
    		void on_button_clicked();
     
    	public :
    		Fenetre();		
    		void montrer();
    		~Fenetre();
    };
    .cc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    /* g++ -o gtkmm gtkmm.cc `pkg-config gtkmm-2.4 --cflags --libs` */
     
    #include "gtkmm.hh"
     
    void Fenetre::on_button_clicked()
    {
        cout << "Appui sur le bouton" << endl;
    }	
     
    Fenetre::Fenetre() : bouton("click me !"), vbox(true,0)
    {
    	set_size_request(320, 240);
     
    	add(vbox);
     
    	vbox.pack_start(bouton,true,true,0);
    	bouton.signal_clicked().connect(sigc::ptr_fun(&Fenetre::on_button_clicked));
    }
     
    void Fenetre::montrer()
    {
    	show_all_children();
    }
     
    Fenetre::~Fenetre()
    {
    }
     
    int main(int argc, char *argv[])
    {
    	Main kit(argc, argv);
     
    	Fenetre fen;
    	fen.montrer();
     
    	Main::run(fen);
     
    	return EXIT_SUCCESS;
    }
    Mais toujours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gtkmm.cc: In constructor «Fenetre::Fenetre()»:
    gtkmm.cc:17: erreur: no matching function for call to «ptr_fun(void (Fenetre::*)())»

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Points : 83
    Points
    83
    Par défaut
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bouton.signal_clicked().connect(sigc::mem_fun(*this, &Fenetre::on_button_clicked));
    ?

  11. #11
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    oui c'est bon comme ça mais pourquoi ?

    edit : j'ai trouvé la bonne page dans la doc gtkmm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sigc::ptr_fun() generates a slot for a standalone function or static method. sigc::mem_fun() generates a slot for a member method of a particular instance.
    Merci Anium.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Points : 83
    Points
    83
    Par défaut
    Pas de quoi

    Merci pour le petit point sur la doc

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fermer une application Windows
    Par telecnop dans le forum Langage
    Réponses: 20
    Dernier message: 28/06/2006, 21h15
  2. [vb.net] fermer l'application en cas de bug
    Par arnolem dans le forum Windows Forms
    Réponses: 6
    Dernier message: 01/06/2005, 15h48
  3. Comment fermer l'application en même temps que Windows ?
    Par semaj_james dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2004, 22h17
  4. [VB6]Fermer une application avec VB
    Par Mylou dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 04/04/2003, 21h32
  5. Fermer une application à l'aide de OnIdle
    Par Thierry Rapp dans le forum Composants VCL
    Réponses: 2
    Dernier message: 29/08/2002, 12h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo