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+ avec C & C++ Discussion :

[gtkmm] Affichage de widgets dans une Gtk::Window


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Homme Profil pro
    Rien
    Inscrit en
    Octobre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Rien

    Informations forums :
    Inscription : Octobre 2010
    Messages : 25
    Par défaut [gtkmm] Affichage de widgets dans une Gtk::Window
    Bonjour

    Voilà je rencontre un problème assez embêtant ^^'

    J'aimerais afficher un bouton dans une Gtk::VBox que j'ajoute à une Gtk::Window or malgré l'utilisation de show(), de show_all() ou encore de show_all_children(), je n'ai absolument aucun bouton sur ma Gtk::Window.

    Voici 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
     
    #include "mainWindow.h"
    #include <gtkmm/button.h>
    #include <gtkmm/box.h>
     
    MainWindow::MainWindow() // hérite de Gtk::Window
    {
    	set_position(Gtk::WIN_POS_CENTER);
    	set_default_size(1000, 600);
     
    	Gtk::VBox box(false, 10);
            add(box);
     
    	Gtk::Button b("button");
    	box.pack_start(b, Gtk::PACK_EXPAND_WIDGET);
    	b.show();
     
    	show_all_children();
    }
    Je ne comprends pas où est mon erreur qui est peut être toute bête mais une vue extérieure sur mon code est sûrement meilleure

    Merci d'avance.

    EDIT: ajout de la méthode add() oubliée mais cela ne m'affiche toujours rien

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Il faudrait peut être ajouter ta box à ta fenêtre avec la méthode add();?

  3. #3
    Membre averti
    Homme Profil pro
    Rien
    Inscrit en
    Octobre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Rien

    Informations forums :
    Inscription : Octobre 2010
    Messages : 25
    Par défaut
    Mais quel idiot! --' Merci ^^'

    EDIT: Euh ça ne m'affiche toujours rien... ^^'

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Il vaut mieux je pense faire un show_all(); plutôt qu'un show_all_children();.

  5. #5
    Membre averti
    Homme Profil pro
    Rien
    Inscrit en
    Octobre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Rien

    Informations forums :
    Inscription : Octobre 2010
    Messages : 25
    Par défaut
    J'avais déjà testé et je viens de re-tester mais ça n'affiche toujours rien T_T

  6. #6
    Membre averti
    Homme Profil pro
    Rien
    Inscrit en
    Octobre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Rien

    Informations forums :
    Inscription : Octobre 2010
    Messages : 25
    Par défaut
    J'ai testé la méthode get_is_toplevel(); sur mon Gtk::Button et mon Gtk::VBox et celle ci retourne false pour les deux le problème serait là? Si oui comment le régler?

  7. #7
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Non, cela ne vient pas de là. Une top-level window, c'est la fenêtre de plus haut niveau, dérivée de GtkWindow. C'est ce que tu as appelé MainWindow.

  8. #8
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Voila un exemple minimaliste pour obtenir ce que tu veux. Je pense que ton problème vient de la déclaration en local des widgets que tu veux insérer dans ta fenêtre.
    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
    #include <gtkmm.h>
     
     
    class MainWindow : public Gtk::Window
    {
      public:
        MainWindow();
        ~MainWindow();
     
      private:
        Gtk::VBox box;
        Gtk::Button button;
    };
     
    MainWindow::MainWindow() // hérite de Gtk::Window
    {
      set_position(Gtk::WIN_POS_CENTER);
      set_default_size(1000, 600);
     
      box.set_homogeneous(false);
      box.set_spacing(10);
      add(box);
     
      button.set_label("button");
      box.pack_start(button, Gtk::PACK_EXPAND_WIDGET);
    }
     
    MainWindow::~MainWindow()
    {
     
    }
     
    int
    main(int argc, char *argv [])
    {
      // Initialisation de Gtkmm
      Gtk::Main kit(argc, argv);
     
      MainWindow window;
     
      window.show_all();
     
      // Lancement de la boucle principale
      kit.run();
     
      return 0;
    }

  9. #9
    Membre averti
    Homme Profil pro
    Rien
    Inscrit en
    Octobre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Rien

    Informations forums :
    Inscription : Octobre 2010
    Messages : 25
    Par défaut
    Merci beaucoup gerald, le problème venait effectivement du fait que mes widgets étaient déclaré en local mais même si maintenant le problème est résolu, as tu une explication au fait qu'on ne puisse pas utiliser ces widgets créés en local? ^^'

  10. #10
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    L'exécution du constructeur une fois terminé, les variables internes sont détruites. Ca reste un fonctionnement classique du C/C++.
    MainWindow(); se termine même si l'objet existe toujours. Et c'est tant mieux sinon on ne reprendrait jamais la main . Le fait de les déclarer en tant que variables de l'objet, elles seront conservée tant que l'objet sera en vie.

  11. #11
    Membre averti
    Homme Profil pro
    Rien
    Inscrit en
    Octobre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Rien

    Informations forums :
    Inscription : Octobre 2010
    Messages : 25
    Par défaut
    C'est dû au fait que Gtkmm utilise des références plutôt que des pointeurs, vu que Qt utilise des pointeurs et que je n'ai jamais eu de problèmes, je pense que c'est ça non? ^^

  12. #12
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Non. On ne peut pas dire ca. Disons qu'il faut bien comprendre le principe de l'allocation dans la pile et dans le tas.
    Quand tu me dis que Qt utilises des pointeurs en lieu et place des références, en réalité Qt fait des allocations dans le tas. Donc lorsque la méthode se termine, la variable n'est pas perdue puisqu'elle ne fait pas partie de la mémoire allouée pour celle-ci.
    Je te redonne l'exemple précédent en employant des pointeurs. Cette fois-ci j'alloue dans le tas les différents widgets. Je n'ai donc plus besoin de les déclarer en tant que variables de l'objet.
    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
    #include <gtkmm.h>
     
     
    class MainWindow : public Gtk::Window
    {
      public:
        MainWindow();
        ~MainWindow();
    };
     
    MainWindow::MainWindow() // hérite de Gtk::Window
    {
      Gtk::VBox *box = NULL;
      Gtk::Button *button = NULL;
     
      set_position(Gtk::WIN_POS_CENTER);
      set_default_size(1000, 600);
     
      box = new Gtk::VBox(false, 10);
      add(*box);
     
      button = new Gtk::Button("button");
      box->pack_start(*button, Gtk::PACK_EXPAND_WIDGET);
    }
     
    MainWindow::~MainWindow()
    {
     
    }
     
    int
    main(int argc, char *argv [])
    {
      // Initialisation de Gtkmm
      Gtk::Main kit(argc, argv);
     
      MainWindow window;
     
      window.show_all();
     
      // Lancement de la boucle principale
      kit.run();
     
      return 0;
    }

  13. #13
    Membre averti
    Homme Profil pro
    Rien
    Inscrit en
    Octobre 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Rien

    Informations forums :
    Inscription : Octobre 2010
    Messages : 25
    Par défaut
    Ah d'accord, bon bah merci beaucoup

  14. #14
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Histoire de donner un exemple un peu plus complet, voila le code avec en plus la gestion du signal "delete-event":
    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
    54
    55
    56
    57
    58
    #include <gtkmm.h>
     
     
    class MainWindow : public Gtk::Window
    {
      public:
        MainWindow();
        ~MainWindow();
     
      private:
        bool destroy(GdkEventAny* event);
    };
     
    MainWindow::MainWindow() // hérite de Gtk::Window
    {
      Gtk::VBox *box = NULL;
      Gtk::Button *button = NULL;
     
      set_position(Gtk::WIN_POS_CENTER);
      set_default_size(1000, 600);
     
      box = new Gtk::VBox(false, 10);
      add(*box);
     
      button = new Gtk::Button("button");
      box->pack_start(*button, Gtk::PACK_EXPAND_WIDGET);
     
      // Connexion du signal "delete-event" pour destruction de la fenêtre.
      signal_delete_event().connect(sigc::mem_fun(*this, &MainWindow::destroy));
    }
     
    MainWindow::~MainWindow()
    {
     
    }
     
    bool
    MainWindow::destroy(GdkEventAny* event)
    {
      Gtk::Main::quit();
      return false;
    }
     
    int
    main(int argc, char *argv [])
    {
      // Initialisation de Gtkmm
      Gtk::Main kit(argc, argv);
     
      MainWindow window;
     
      window.show_all();
     
      // Lancement de la boucle principale
      kit.run();
     
      return 0;
    }

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

Discussions similaires

  1. [gtkmm] Drag n drop dans une Gtk::Grid
    Par ThiuT dans le forum GTK+
    Réponses: 3
    Dernier message: 10/07/2012, 11h28
  2. affichage dans une fennêtre windows
    Par vmfa-2 sven dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 03/06/2008, 12h54
  3. Insérer un Gdk.Pixmap dans une Gtk.Window
    Par ZbergK dans le forum Ada
    Réponses: 1
    Dernier message: 25/02/2007, 11h18
  4. [8.0] Intégration de PostGreSQL dans une appli windows
    Par Didier69 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 27/01/2005, 16h26
  5. Accents dans une console windows
    Par JolyLoic dans le forum Windows
    Réponses: 8
    Dernier message: 20/10/2004, 00h57

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