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 :

GtkUIManager : Menu vertical ?


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par défaut GtkUIManager : Menu vertical ?
    Bonjour à tous. Je travail sous Fedora 18 avec la version 3.6.4 de GTK
    et j'essai tant bien que mal de créer un menu à l'aide de GTKUIManager
    via le tutoriel disponible sur le site ainsi que de la documentation officielle
    et du tutoriel disponible sur le site live.gnome.org mais rien n'y fait mon
    menu est extrémement moche et ne ressemble pas à un menu !

    De plus les icônes chargées via GTK_STOCK_**** n'apparaissent pas...
    Je ne vous mets pas le code source car c'est plus ou moins le même
    que celui du tutoriel disponible sur le site ici : http://nicolasj.developpez.com/gtk/gtkuimanager/


    Note : Même en faisant un copier-coller du code source du tutoriel j'ai un
    truc moche. (Menu aligné sur la verticale à gauche et sans icônes...).


    Est-ce qu'il faut utiliser d'autres fonctions pour mettre en forme l'aspect
    graphique ? Merci d'avance.

    Je vous mets un screenshot :

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par défaut
    J'ai trouvé une partie de la solution :
    Il faut mettre gtk_box_new (TRUE, 0)

    TRUE = horizontal apparemment et 0 c'est l'espacement entre les "enfants" en pixels.

    Par contre les images n'apparaissent pas dans le menu mais seulement dans la barre d'outils c'est pas cool...

    Y'a t-il moyen d'ajouter des images *.png ou *.jpg à la place de GTK_STOCK
    toujours via GktUIManager ? Merci

  3. #3
    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
    gtk_box_new, ça n'existe pas, c'est gtk_hbox_new ou gtk_vbox_new. C'est ce qui indique si tu crée un conteneur horizontal ou vertical. Ensuite, n'essaie pas de deviner à quoi servent les arguments ! Lis plutôt la documentation. Par exemple pour gtk_vbox_new:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    GtkWidget * gtk_hbox_new (gboolean homogeneous, gint spacing);
    Creates a new GtkHBox.
    
    homogeneous :TRUE if all children are to be given equal space allotments.
    spacing : the number of pixels to place by default between children.
    Returns : a new GtkHBox.
    Donc le booléen contrôle la quantité d'espace à allouer aux widgets que tu mets dedans, c'est à dire si elle doit être partagée de manière identique entre chaque widget. Ce qui n'est pas le cas pour une barre de menu, tu dois donc utiliser la valeur FALSE.

    Ensuite, c'est gtk_box_pack_start que tu as vraissemblablement utilisé pour ajouter ton menu dans la box. Et c'est l'argument expand qu'il faut mettre à FALSE, pour indiquer que le menu ne doit prendre que l'espace nécessaire, et pas plus, même s'il y a plus d'espace disponible.

    Enfin, pour le problème d'images dans les menus, ça a été retiré il y a un moment déjà, mais c'est juste un comportement par défaut qui a changé. Tu peux le restaurer en lançant gnome-tweak-tool, dans la section "Theme', il faut activer "menus have icons". Cela peut se faire avec dconf-editor aussi, ou avec gsettings en ligne de commande avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gsettings set org.gnome.desktop.interface menus-have-icons true
    Pour ce qui est de l'exemple du tuto, son fonctionnement est tout à fait normal... Je ne vois pas ce que tu trouves de choquant dans le fait que le menu soit aligné à gauche... J'ai testé avec GTK 3.4.1 sous Linux.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par défaut
    Merci tout d'abord pour vos réponses.

    Avoir un menu tout long, tout moche à gauche j'ai jamais vu ça dans aucune application.
    (cf screenshot), voilà pourquoi ça me choque et je me demandais si c'était les tutoriels
    disponibles sur le net qui préféraient avoir cet aspect là ou bien si c'était juste un problème venant de moi (mauvaise utilisation de fonction, configuration de gtk,...)

    Pour ce qui est de gtk_box_new cette fonction existe (je fais quand même des recherches sur internet pour éviter de poster de grosses bétises même si je n'affirme pas dans ce que j'ai dis que je détiens la vérité : "TRUE = horizontal APPAREMMENT").

    Voilà ce que j'ai vu de gtk_box_new :
    https://developer.gnome.org/gtk3/3.4/GtkBox.html

    et j'ai dit que TRUE = Horizontal APPAREMMENT car en changeant seulement cette valeur dans tout le code je suis passé de l'affichage moche vu sur le screen à un menu correcte avec une belle barre d'outil.

    Pour ce qui est de la fonction gtk_box_pack_start je viens de vérifier, elle est bien à FALSE pour son 3e argument.

    je regarderai pour les images demain (aujourd'hui plus tard).

    Merci à vous.
    Bonne nuit.

  5. #5
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    En fait, gtk_box_new() n'existait pas dans GTK+-2 , c'est une nouveauté de GTK-3, qui déprécie gtk_hbox_new() et gtk_vbox_new() (qui existent encore).
    J'en profite pour déplorer ici que la compatibilité entre GTK2 et GTK3 ne soit pas meilleure et qu'un certain nombre de fonctions (surtout avec GDK) aient disparues.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par défaut
    Effectivement. Je viens de voir cela sur le guide officiel de GTK.
    C'est une nouveauté de GTK-3.

    Pour ce qui est des icônes que je voulais ajouter, j'ai essayé de mettre
    mes propres icônes en utilisant des codes sources trouvés à droite à gauche.
    J'ai réussi à utiliser mes propres icônes mais j'ai encore un souci.
    Une erreur du style : "gtk_box_start, un enfant n'est pas relié à un parent..."
    au lancement du programme. Je vais encore travailler un peu dessus.
    J'ai trouvé une solution sur google mais je ne comprends pas très bien ce que le mec veut dire.
    Je vais chercher encore un peu et si j'y arrive pas je poste mon code source demain.

    Merci.

  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
    Citation Envoyé par Twice22 Voir le message
    Avoir un menu tout long, tout moche à gauche j'ai jamais vu ça dans aucune application.
    Non, le screenshot n'est pas normal, mais l'exemple du tutoriel est correct et donne un résultat normal (différent du tien).

    Citation Envoyé par Twice22 Voir le message
    (cf screenshot), voilà pourquoi ça me choque et je me demandais si c'était les tutoriels
    disponibles sur le net qui préféraient avoir cet aspect là ou bien si c'était juste un problème venant de moi (mauvaise utilisation de fonction, configuration de gtk,...)
    Vraissemblablement, tu as la mauvaise orientation de conteneur (box horizontale au lieu de verticale).

    Citation Envoyé par Twice22 Voir le message
    Pour ce qui est de gtk_box_new cette fonction existe (je fais quand même des recherches sur internet pour éviter de poster de grosses bétises même si je n'affirme pas dans ce que j'ai dis que je détiens la vérité : "TRUE = horizontal APPAREMMENT").

    Voilà ce que j'ai vu de gtk_box_new :
    https://developer.gnome.org/gtk3/3.4/GtkBox.html
    Ah, exact, désolé, j'avais désactivé GTK 3 dans devhelp, j'avais oublié que ça a été introduit dans GTK 3.

    Citation Envoyé par Twice22 Voir le message
    et j'ai dit que TRUE = Horizontal APPAREMMENT car en changeant seulement cette valeur dans tout le code je suis passé de l'affichage moche vu sur le screen à un menu correcte avec une belle barre d'outil.
    Ce n'est pas un booléen mais un type énuméré qu'il faut passer, un GtkOrientation, donc soit GTK_ORIENTATION_HORIZONTAL, soit GTK_ORIENTATION_VERTICAL. Mais le tutoriel est en GTK 2, et si tu utilises cette fonction, c'est que tu as essayé de l'adapter pour GTK 3... Et c'est dans la manière dont tu l'adaptes qu'il y a l'erreur.

    Citation Envoyé par Twice22 Voir le message
    Pour ce qui est de la fonction gtk_box_pack_start je viens de vérifier, elle est bien à FALSE pour son 3e argument.

    je regarderai pour les images demain (aujourd'hui plus tard).
    Dans ce cas le mieux est de nous fournir ton code, ce sera plus simple, surtout si tu as modifié l'exemple de base en GTK 2...

  8. #8
    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
    Citation Envoyé par pvincent Voir le message
    J'en profite pour déplorer ici que la compatibilité entre GTK2 et GTK3 ne soit pas meilleure et qu'un certain nombre de fonctions (surtout avec GDK) aient disparues.
    Bin en même temps c'est un peu le principe du changement de version majeure: la rupture de compatibilité. C'est justement pour ne pas avoir à conserver le même comportement pour de vieux trucs qu'ils ont changé de version. Et GDK était déjà grandement rendu obsolète par cairo, même du temps de GTK 2. On ne peut pas reprocher au toolkit d'évoluer, surtout que certains se plaignent justement de sa stagnation...

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par défaut
    Re-bonjour.

    Voilà j'ai essayé de mettre mes propres icônes (et ça à l'air de marcher) mais j'ai quand même une erreur lors de l'éxécution du programme dans la console.

    le fichier xml :
    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
    <ui>
      <menubar name="MenuPrincipal">
        <menu action="FichierMenuAction">
          <menuitem action="NouveauAction" />
          <menuitem action="OuvrirAction" />
          <menuitem action="QuitterAction" />
        </menu>
         <menu name="AlgorithmesMenu" action="AlgorithmesMenuAction">
          <menuitem action="PlusProcheVoisinAction" />
          <menuitem action="PlusProcheAdditionAction" />
          <menuitem action="InsertionMoindreCoutAction" />
          <menuitem action="InsertionPlusLointaineAction" />
        </menu>
        <menu name="AideMenu" action="AideMenuAction">
          <menuitem action="AideAction" />
          <menuitem action="AProposAction" />
        </menu>
      </menubar>
     
      <toolbar name="BarreOutil" action="BarreOutilAction">
        <placeholder name="ItemsAOutils">
          <toolitem action="NouveauAction" />
          <toolitem action="OuvrirAction" />
          <toolitem action="QuitterAction" />
          <separator />
          <toolitem action="PlusProcheVoisinAction" />
          <toolitem action="PlusProcheAdditionAction" />
          <toolitem action="InsertionMoindreCoutAction" />
          <toolitem action="InsertionPlusLointaineAction" />
          <separator />
          <toolitem action="AideAction" />
          <toolitem action="AProposAction" />
        </placeholder>
      </toolbar>
    </ui>

    Voilà le code source :
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <gtk/gtk.h>
     
    static void menuNouveau (void);
    static void menuOuvrir (void);
    static void menuQuitter (void);
     
    /*
    static void menuPPV (void);
    static void menuPPA (void);
    static void menuIMC (void);
    static void menuIPL (void); */
     
    static void menuAide (void);
    //static void menuAPropos (void);
     
    static void menuAjouterWidget (GtkUIManager *, GtkWidget *, GtkContainer *);
     
    int main (int argc, char* argv[])
    {
      GtkWidget *pFenetre = NULL;
      GtkWidget *pBoite = NULL;
      GtkUIManager *puiManager = NULL;
      GtkActionGroup *pActionGroupe = NULL;
      GError *error;
      GtkWidget *menubar = NULL;
      GtkWidget *toolbar = NULL;
     
      GtkWidget *image;           /* prendre mes images */
      GtkIconFactory *factory;
      GtkIconSource *source;
      GtkIconSet *set;
      GtkStockItem item;
     
      char chemin[256];         /* chemin des images */
     
      /* Création du menu */
     static  GtkActionEntry entries[] =
        {
          { "FichierMenuAction",        NULL,            "Fichier",                    NULL,           NULL, NULL                        },
          { "NouveauAction",            GTK_STOCK_NEW,   "_Nouveau",                   "<control>N",   "Nouveau", G_CALLBACK (menuNouveau)    },
          { "OuvrirAction",             GTK_STOCK_OPEN,  "_Ouvrir",                    "<control>O",   "Ouvrir", G_CALLBACK (menuOuvrir)     },
          { "QuitterAction",            GTK_STOCK_QUIT,  "_Quitter",                   "<control>Q",   "Quitter", G_CALLBACK (menuQuitter)    },
          { "AlgorithmesMenuAction",    NULL,            "Algorithmes",                NULL,           NULL,    NULL              },
          { "AideMenuAction",           NULL,            "Aide",                       NULL,           NULL, NULL                        },
          { "AideAction",               GTK_STOCK_HELP,  "Aide",                       "<release>F1",  "Aide", G_CALLBACK(menuAide)        },
          { "AProposAction",            GTK_STOCK_ABOUT, "_A propos",                  "<control>A" ,  "A Propos", NULL /*G_CALLBACK(menuAPropos)*/     }
        };
     
     
     static GtkRadioActionEntry radio_entries[] = 
       {
         { "PlusProcheVoisinAction",  "TSP_PROCHE",            "Plus Proche Voisin",         NULL,           "Plus Proche Voisin",  0},
         { "PlusProcheAdditionAction", "TSP_ADDITION",            "Plus Proche Addition",       NULL,          "Plus Proche Addition" , 0 },
         { "InsertionMoindreCoutAction", "TSP_MOINDRE_COUT",            "Insertion Moindre Cout",     NULL,          "Insertion Moindre Cout" , 0 },
         { "InsertionPlusLointaineAction", "TSP_PLUS_LOIN",            "Insertion Plus Lointaine",   NULL,           "Insertion Plus Lointaine", 0 },
       };
     
      /* Initialisatio de GTK+ */
      gtk_init(&argc, &argv);
     
      /* Création de la fenetre */
      pFenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     
     
      /* création d'une structure pour les images */
      static struct
      {
         gchar *nomFichier;
         gchar *stockId;
      } stockIcones[] =
          {
    	 { "plusProche.png", "TSP_PROCHE" },
    	 { "plusAddition.png", "TSP_ADDITION" },
    	 { "moindreCout.png", "TSP_MOINDRE_COUT" },
    	 { "plusLoin.png", "TSP_PLUS_LOIN" }
          };
      static gint nbrIcones = G_N_ELEMENTS (stockIcones);
     
      /* chargement des images */
      factory = gtk_icon_factory_new();
      int i;
      for (i = 0 ; i < nbrIcones ; i++)
        {
          set = gtk_icon_set_new();
          source = gtk_icon_source_new();
     
          sprintf(chemin, "%s/", getcwd(chemin, sizeof(chemin)));
          strcat(chemin, stockIcones[i].nomFichier);
          gtk_icon_source_set_filename( source, chemin);
          gtk_icon_set_add_source( set, source );
          gtk_icon_source_free (source);
          gtk_icon_factory_add( factory, stockIcones[i].stockId , set );
          gtk_icon_set_unref (set);
        }
       gtk_icon_factory_add_default ( factory );
       g_object_unref (factory);
     
       /* Caractéristique de la fenetre principale */
       gtk_window_set_position(GTK_WINDOW(pFenetre), GTK_WIN_POS_CENTER_ON_PARENT);
       gtk_window_set_title(GTK_WINDOW(pFenetre), "Traveling Salesman Problem");
       gtk_window_set_default_size(GTK_WINDOW(pFenetre), 800, 600);
       gtk_window_set_resizable (GTK_WINDOW(pFenetre), TRUE);
       gtk_window_iconify (GTK_WINDOW(pFenetre));
       gtk_window_maximize (GTK_WINDOW(pFenetre));
       g_signal_connect(G_OBJECT(pFenetre), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
      /* Creation d'une vBox */
      pBoite = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
      gtk_container_add (GTK_CONTAINER (pFenetre), pBoite);
     
     
      /* Creation du menu */
      pActionGroupe = gtk_action_group_new ("menuActionGroupe");
      gtk_action_group_add_actions (pActionGroupe, entries, G_N_ELEMENTS (entries), NULL);
      gtk_action_group_add_radio_actions (pActionGroupe, radio_entries, G_N_ELEMENTS (radio_entries), 1, NULL, NULL);
     
      puiManager = gtk_ui_manager_new ();
      gtk_ui_manager_insert_action_group (puiManager, pActionGroupe, 0);
      gtk_ui_manager_add_ui_from_file (puiManager, "menu.xml", NULL);
      g_signal_connect (puiManager, "add_widget", G_CALLBACK (menuAjouterWidget), pBoite);
     
      error = NULL;
      gtk_ui_manager_add_ui_from_file (puiManager, "menu.xml", &error);
     
      if (error)
        {
            g_message ("La construction du menu a merdé: %s", error->message);
            g_error_free (error);
        }
     
      /* Ajout le menu et la barre d'outil à la vertical de la place. */
      menubar = gtk_ui_manager_get_widget (puiManager, "/MenuPrincipal");
      gtk_box_pack_start (GTK_BOX (pBoite), menubar, FALSE, FALSE, 0);
      toolbar = gtk_ui_manager_get_widget (puiManager, "/BarreOutil");
      gtk_box_pack_start (GTK_BOX (pBoite), toolbar, FALSE, FALSE, 0);
     
      /* Autorise l'utilisation des raccourcis. */
       gtk_window_add_accel_group (GTK_WINDOW (pFenetre), gtk_ui_manager_get_accel_group (puiManager));
     
      /* Boucle principale */
      gtk_widget_show_all(pFenetre);
      gtk_main();
      gtk_widget_destroy(pFenetre);
     
      return EXIT_SUCCESS;
    }
     
    static void menuAjouterWidget (GtkUIManager * puiManager, GtkWidget * pWidget, GtkContainer * pBoite)
    {
       gtk_box_pack_start (GTK_BOX (pBoite), pWidget, FALSE, FALSE, 0);
       gtk_widget_show (pWidget);
       return;
    }
     
    static void menuNouveau (void)
    {
       GtkWidget *pDialogue = NULL;
     
       pDialogue = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Nouveau");
       gtk_dialog_run (GTK_DIALOG (pDialogue));
       gtk_widget_destroy (pDialogue);
       return;
    }
     
    static void menuOuvrir (void)
    {
       GtkWidget *pDialogue = NULL;
     
       pDialogue = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Ouvrir");
       gtk_dialog_run (GTK_DIALOG (pDialogue));
       gtk_widget_destroy (pDialogue);
       return;
    }
     
    static void menuQuitter (void)
    {
       gtk_main_quit ();
       return;
    }
     
    static void menuAide (void)
    {
       GtkWidget *pDialogue = NULL;
     
       pDialogue = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Aide");
       gtk_dialog_run (GTK_DIALOG (pDialogue));
       gtk_widget_destroy (pDialogue);
       return;
    }

    Voilà l'erreur :
    (gtk:3655): Gtk-CRITICAL **: gtk_box_pack: assertion `gtk_widget_get_parent (child) == NULL' failed

    (gtk:3655): Gtk-CRITICAL **: gtk_box_pack: assertion `gtk_widget_get_parent (child) == NULL' failed

    j'ai été voir la solution proposée ici : http://host-145.plantware.net/questi...ly-to-a-gtkbox

    mais je ne comprends pas bien... il faut que je créé les Widgets sans avoir préalablement créé de fenêtre ? oO

    Pour l'instant j'ai pas créé l'appel aux fonctions mais je me demande comment est-ce que je peux faire pour récupérer l'état de mes RadioAction ?
    En fait les 4 icônes que j'ai créé et ajouté moi-même ne peuvent être cochées en même temps et je vais ensuite rajouter un bouton "GO" dans la fenêtre de mon programme et quand on cliquera dessus l'heuristique choisie (le bouton enfoncé parmi les 4) sera utilisé pour résoudre le problème du voyageur de commerce. Comment savoir quel bouton est enfoncé et utiliser la bonne heuristique en fonction ?
    Il faut utiliser une fonction 'du style' gtk_radio_action_get_current_value() mais comment ?

    J'ai mis des 0 aux derniers paramètres de la GtkRadioActionEntry car je sais pas quoi mettre par défaut sachant que ce paramètre correspond à :
    gint value;
    The value to set on the radio action. See gtk_radio_action_get_current_value().


    Et j'ai mis GTK_ORIENTATION_VERTICALE dans la fonction gtk_box_new pour avoir un vrai menu et pas le menu tout moche que j'avais posté au début...


    Merci d'avance.

  10. #10
    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
    Il manque le contenu mis à jour de menu.xml...

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par défaut
    J'ai rajouté le fichier xml.

  12. #12
    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
    Bon, j'ai mis un moment à comprendre, mais GtkUIManager est un widget que je n'ai jamais trop compris.

    Ton message d'erreur est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_box_pack: assertion `gtk_widget_get_parent (child) == NULL' failed
    Qu'est-ce que cela signifie ? Dans un appel à gtk_box_pack, le code a cherché à récupérer le parent d'un widget. Le parent, c'est le contenant (ta box), l'enfant, c'est ton contenu (le GtkUIManager qui fournit menu + toolbar).

    Le code cherche à vérifier que le parent de ton enfant vaut NULL. Pourquoi ? Parce qu'un enfant ne peut avoir qu'un seul parent dans la hiérarchie des widgets (mais un parent peut avoir plusieurs enfants). Ton soucis vient donc du fait que tu essaies d'ajouter un widget dans un conteneur, alors que ce widget est déjà dans un conteneur !

    En regardant ton code, on constate donc qu'effectivement, tu ajoutes 2 fois les mêmes widgets dans la même GtkBox: une fois automatiquement dans ta callback menuAjouterWidget (ton appel à gtk_box_pack_start ligne 154), et une autre fois manuellement ligne 136 à 139. Si tu effaces ces ajouts manuels, ton code fonctionnera.

    Pour éviter ce genre d'erreur, je te conseille d'utiliser un constructeur d'interface graphique comme Glade. Tu pourras ajouter tes éléments graphiquement.

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par défaut
    Merci beaucoup ! C'était effectivement cela.
    je cherchais l'erreur ailleurs...

    Pour ce qui est de Glade je connais de nom mais je trouve qu'il n'y a pas trop
    de tutoriels complets dessus et puis j'ai aussi envie d'utiliser la bibliothèque
    cairo et il me semble pas que je puis insérer des Drawing Area ou autre trucs
    spécifiques à Cairo avec Glade.

    Cependant est-ce je peux facilement ouvrir et modifier mon code fait 'main'
    à l'aide de Glade à l'avenir ?

  14. #14
    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
    Tu peux tout à fait ajouter un GtkDrawingArea avec Glade, c'est un widget comme un autre. En revanche, dessiner en utilisant cairo sera forcément effectué dans ton code, pas dans Glade.

    Glade ouvre des fichiers XML qui décrivent ton interface, tu ne peux donc pas ouvrir ton code C pour en extraire l'interface que tu as déjà créée.

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

Discussions similaires

  1. [C#] Comment faire un Menu vertical style 'outlook'?
    Par Eome dans le forum Windows Forms
    Réponses: 7
    Dernier message: 10/09/2008, 09h02
  2. menu vertical développable
    Par gregius dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/06/2006, 22h03
  3. Menu vertical fixe
    Par batmat86 dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 10/01/2006, 02h54
  4. Menu vertical différent sous FF et IE
    Par Myogtha dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 06/12/2005, 00h29

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