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 :

[GTK3] Récupérer label radio menu item actif


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2010
    Messages : 83
    Par défaut [GTK3] Récupérer label radio menu item actif
    Bonjour,
    Ça fait deux heures que je cherche mais aucun résultat. Faut dire que GTK3 n'existe pas sur internet, si on retirait la doc officielle (qui sert pas à grand choses je trouve) Google ignorerait presque l’existence de GTK3.
    J'ai bien essayé d'adapter le code GTK2 du tuto http://gtk.developpez.com/cours/gtk2/ mais rien à faire.

    Parlons 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
                game = gtk_menu_new ();
     
                    new_item = gtk_menu_item_new_with_label ( _("New"));
                    g_signal_connect ( G_OBJECT(new_item), "activate", G_CALLBACK (new_game), NULL);
                    gtk_menu_shell_append (GTK_MENU_SHELL(game), new_item);
     
                    level_easy_item = gtk_radio_menu_item_new_with_label (group, _("Easy"));
                    group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (level_easy_item));
                    g_signal_connect ( G_OBJECT(level_easy_item), "activate", G_CALLBACK (chLevel), NULL);
                    gtk_menu_shell_append (GTK_MENU_SHELL(game), level_easy_item);
     
                    level_medium_item = gtk_radio_menu_item_new_with_label (group, _("Medium"));
                    group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (level_medium_item));
                    g_signal_connect ( G_OBJECT(level_medium_item), "activate", G_CALLBACK (chLevel), NULL);
                    gtk_menu_shell_append (GTK_MENU_SHELL(game), level_medium_item);
     
                    level_hard_item = gtk_radio_menu_item_new_with_label (group, _("Hard"));
                    group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (level_hard_item));
                    g_signal_connect ( G_OBJECT(level_hard_item), "activate", G_CALLBACK (chLevel), NULL);
                    gtk_menu_shell_append (GTK_MENU_SHELL(game), level_hard_item);
     
     
                level_easy_item = gtk_menu_item_new_with_label ( _("Game"));
                gtk_menu_item_set_submenu (GTK_MENU_ITEM(level_easy_item), game);
                gtk_menu_shell_append(GTK_MENU_SHELL(menu), level_easy_item);
    L'objectif est de récupérer en une fonction chLevel le label du GTK_RADIO_MENU_ITEM sélectionné, et si possible avec un autre argument, un pointeur vers une variable, dans cette même fonction (sinon je serais obligé d'en faire une globale alors déjà que j'ai que ça des globales dans mon code...
    Merci de votre aide.

  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 : 55
    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
    Le signal "activate" demande comme prototype de callback ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void                user_function                      (GtkMenuItem *menuitem,
                                                            gpointer     user_data)
    Dans cette fonction tu récupères naturellement le GtkMenuItem activé. Pour rappel Les GtkRadioMenuItem héritent des GtkMenuItem.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    +----GtkMenuItem
          +----GtkCheckMenuItem
                +----GtkRadioMenuItem
    A partir de là tu utilises simplement la fonction const gchar *gtk_menu_item_get_label (GtkMenuItem *menu_item);.

    Où est la difficulté?

    Pour passer un pointeur sur une variable (ou autre chose) utilises le dernier argument de la fonction g_signal_connect();. Tu récupères ta variable dans le callback grâce au dernier argument. On évite ainsi les variables globales.

  3. #3
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2010
    Messages : 83
    Par défaut
    La difficulté ? Euh... Ça fait une semaine que je fais du GTK3 et j'ai appris seul le C pendant deux semaines, c'est ça ?

    Je pense que je suis sur la bonne voie avec ça, merci pour votre aide.

    ==EDIT==
    Merci j'ai réussi

  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 : 55
    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
    Passes ton post en "Résolu" si ca répond à la question (icône en bas de page).

  5. #5
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2010
    Messages : 83
    Par défaut
    Presque résolu en fait.
    Pour le passage de pointeur j'ai un problème.

    En fait, à l'initialisation, j'ai un appel à la fonction init_level, ne dépendant pas des option_menu. La fonction chLevel est en fait un intermédiaire utilisé pour changer le comportement de l'application par l'utilisateur, en cour de partie.
    Mon code ne fonctionne pas. L'interface freeze quand on change la valeur d'un optionmenu.
    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
    void chLevel(GtkWidget *radio, Level *lv)
    {
        gchar *label;
        label = gtk_menu_item_get_label (GTK_MENU_ITEM (radio));
        init_lv(lv, label);
    }
     
    void init_lv (Level *lv, char *difficulty)
    {
    ...
    }
    main()
    {
    ...
                    level_medium_item = gtk_radio_menu_item_new_with_label (group, _("Medium"));
                    group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (level_medium_item));
                    g_signal_connect ( G_OBJECT(level_medium_item), "activate", G_CALLBACK (chLevel), &lv);
                    gtk_menu_shell_append (GTK_MENU_SHELL(game), level_medium_item);
    ...
    }
    De plus, je pensais que activate enverrais le signal seulement quand on cliquait dessus. Or, la fonction est exécutée de fois quand on clique : une fois par le widget qui perd l'activation, et la seconde par celui qui la gagne. Je sais pas comment bloquer la première activation...

    ==EDIT==
    Pour empêcher de recevoir le signal de l’élément qui se désactive, j'ai trouvé une solution, peut-être pas très propre, mais une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void chLevel(GtkWidget *radio, Level *lv)
    {
        static int i;
        if(!i) i=0;
        i+=1;
     
        if(i%2 == 0)
        {
            gchar *label;
            label = gtk_menu_item_get_label (GTK_MENU_ITEM (radio));
            //init_lv(lv, label);
            printf("%s\n", label);
        }
    }

  6. #6
    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 : 55
    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
    Pas évident de répondre ici. Pour commencer le nom du label est renvoyé dans un const char et non un simple char.
    Ceci est dû au fait que tu ne récupères pas une copie du nom mais bien le pointeur interne. Donc interdiction de le modifier à la volée.

    Ton passage d'argument me semble correcte. Si tu modifies label alors fais-en une copie et travailles sur la copie. g_strdup(); est là pour ca.

    Ensuite si tu veux réaffecter le nom éventuellement modifié utilises gtk_menu_item_set_label();.

  7. #7
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2010
    Messages : 83
    Par défaut
    Merci, tout marche
    Mais j'ai un autre problème moins gênant dans l’immédiat...

    Serait-il possible de récupérer sous forme d'index les valeurs ? Au lieu du label récupérer 0 pour le premier, 2 pour le second... Autrement que dans une boucle si possible. Parce que je viens de réaliser qu'avec Gettext ça marcherai pas trop comme le fichier sera en anglais et l'interface dans je ne sais quelle langue ^^'

    PS : @gerald3d : je citerai ton pseudo (avec un lien vers ton profil si j'y arrive) dans les crédits, en remerciements

  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
    Pour ce qui est de la disparition de fonctions, un bon nombre étaient dépréciées depuis bien longtemps. GTK3 est encore jeune (6 mois), donc son existence sur le net est assez limitée, les tutoriels qu'on trouve à droite à gauche étant souvent âgés et traitant de GTK2. Quant au manque de configurabilité de GNOME 3, la Release Team avait déjà repoussé la sortie de 6 mois, et il fallait livrer quitte à ce qu'il y ait moins de fonctionnalités. Retarder la sortie rendait compliqué le développement, les mainteneurs se retrouver à maintenir les versions GTK2 et GTK3 de leurs logiciels 6 mois de plus. Au final, ce les options de personnalisation qui sont passées à la trappe. L'autre raison était aussi que l'on voulait un look "GNOME", identique un peu partout, et que GNOME soit facilement reconnaissable (plus que la distribution).

  9. #9
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2010
    Messages : 83
    Par défaut
    C'est chaud quand même... Je sais pas comment je vais m'y prendre, je récupère la liste et je fais jesaisplusquoi_next( GSList *group) jusqu'à que la valeur du radio récupéré soit la même que celle du radio "toggled" c'est ça ? De mémoire il me semble qu'il y a quelque chose de similaire dans la doc GTK2 de ce site...
    Dites, à quoi servent les radio buttons de GTK ? Parce que Gettext est très utilisé sous GNU/Linux alors utiliser le label a peu d’intérêt comme il changera selon la langue, non ? Enfin j'ai du mal à saisir l'intérêt de certaines fonctions de GTK vu que je pense un peu en Tkinter pour certains widgets.

  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 : 55
    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
    Je t'ai donné une solution technique. Mais ce n'est peut être pas la meilleure. Et peut être pas la plus courte. Une fonction Gtk+ existe peut être?

    Histoire de ne pas être en reste, je te donne une autre manière de faire. Cette méthode rend le code source un peu indigeste mais ca fonctionne.

    Les GtkWidget héritent des GObject. Ils disposent donc d'un pointeur sur une liste. Ce pointeur est à la discrétion de l'utilisateur. Pour l'utiliser on utilise les fonctions
    Je reprends ton code pour te montrer comment les utiliser.

    Assignation des callback:
    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
    ...
    level_easy_item = gtk_radio_menu_item_new_with_label (group, _("Easy"));
                    group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (level_easy_item));
    g_object_set_data(G_OBJECT(level_easy_item), "LEVEL", GINT_TO_POINTER(1));
                    g_signal_connect ( G_OBJECT(level_easy_item), "activate", G_CALLBACK (chLevel), NULL);
                    gtk_menu_shell_append (GTK_MENU_SHELL(game), level_easy_item);
     
                    level_medium_item = gtk_radio_menu_item_new_with_label (group, _("Medium"));
                    group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (level_medium_item));
    g_object_set_data(G_OBJECT(level_medium_item), "LEVEL", GINT_TO_POINTER(2));
                    g_signal_connect ( G_OBJECT(level_medium_item), "activate", G_CALLBACK (chLevel), NULL);
                    gtk_menu_shell_append (GTK_MENU_SHELL(game), level_medium_item);
     
                    level_hard_item = gtk_radio_menu_item_new_with_label (group, _("Hard"));
                    group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (level_hard_item));
    g_object_set_data(G_OBJECT(level_hard_item), "LEVEL", GINT_TO_POINTER(3));
                    g_signal_connect ( G_OBJECT(level_hard_item), "activate", G_CALLBACK (chLevel), NULL);
                    gtk_menu_shell_append (GTK_MENU_SHELL(game), level_hard_item);
    ...
    Dans ton callback tu rècupères ta donnée comme ca:
    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
    ...
    void chLevel(GtkWidget *radio, Level *lv)
    {
        gchar *label;
    int level;
     
        label = gtk_menu_item_get_label (GTK_MENU_ITEM (radio));
     
    level = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(radio), "LEVEL"));
    switch (level)
    {
      case 1 :
        g_print("level easy\n");
        break;
      case 2 :
        g_print("level medium\n");
        break;
      case 3:
        g_print("level hard\n");
        break;
    }
     
        init_lv(lv, label);
    }
    ...

  11. #11
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2010
    Messages : 83
    Par défaut
    C'est exactement ce dont j'avais besoin, merci

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

Discussions similaires

  1. le label d'un item menu trop long
    Par zchallal dans le forum Forms
    Réponses: 2
    Dernier message: 20/10/2007, 18h39
  2. récupérer dans 1 menu le sous menu séléctionner
    Par vincedjs dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 02/03/2006, 13h53
  3. [vb.net][dataview] récupérer l'index des items filtrés ?
    Par graphicsxp dans le forum Windows Forms
    Réponses: 6
    Dernier message: 26/01/2006, 15h55
  4. Récupérer la liste des items d'un champs
    Par korntex5 dans le forum Bases de données
    Réponses: 6
    Dernier message: 11/01/2006, 15h50
  5. [VB.NET] [ListBox / ComboBox] Label de l'item sélectionné?
    Par Giuseppe dans le forum Windows Forms
    Réponses: 5
    Dernier message: 14/12/2005, 14h22

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