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 :

Impossible de faire fonctionner des GtkRadioMenuItem.


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 56
    Points : 48
    Points
    48
    Par défaut Impossible de faire fonctionner des GtkRadioMenuItem.
    Bonjour,

    Je n'arrive pas à faire fonctionner des GtkRadioMenuItem, le programme plante lorsque je clique sur un menuitem. Voici le code de création des radio menu item:
    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
      menu_scheme_list = NULL;
     
      menuitem_s_classic = gtk_radio_menu_item_new_with_label (menu_scheme_list,"classic");
      gtk_widget_show(menuitem_s_classic);
      gtk_container_add (GTK_CONTAINER (menu6), menuitem_s_classic);
      gtk_radio_menu_item_set_group(GTK_RADIO_MENU_ITEM (menuitem_s_classic),menu_scheme_list);
      menu_scheme_list = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM (menuitem_s_classic));
      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem_s_classic), TRUE);
      g_signal_connect(G_OBJECT(menuitem_s_classic),"activate",G_CALLBACK(toggle_menuitem_s_classic),NULL);
     
      menuitem_s_cobalt = gtk_radio_menu_item_new_with_label (menu_scheme_list,"cobalt");
      gtk_widget_show(menuitem_s_cobalt);
      gtk_container_add (GTK_CONTAINER (menu6), menuitem_s_cobalt);
      gtk_radio_menu_item_set_group(GTK_RADIO_MENU_ITEM (menuitem_s_cobalt),menu_scheme_list);
      menu_scheme_list = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM (menuitem_s_cobalt));
      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem_s_cobalt), FALSE);
      g_signal_connect(G_OBJECT(menuitem_s_cobalt),"activate",G_CALLBACK(toggle_menuitem_s_cobalt),NULL);
    Et les 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    void toggle_menuitem_s_classic(GtkWidget *widget, gpointer p)
    {
      if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) {
     
      } else {
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_s_classic),TRUE);
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_s_cobalt),FALSE);
        LISTE_OPEN_FILES *l = liste_editor_open_files;
        while(l != NULL) {
          gtk_source_buffer_set_style_scheme(l->sBuf,s_classic);
          l = l->suiv;
        }
      }
    }
     
    void toggle_menuitem_s_cobalt(GtkWidget *widget, gpointer p)
    {
      if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) {
     
      } else {
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_s_classic),FALSE);
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem_s_cobalt),TRUE);
        LISTE_OPEN_FILES *l = liste_editor_open_files;
        while(l != NULL) {
          gtk_source_buffer_set_style_scheme(l->sBuf,s_cobalt);
          l = l->suiv;
        }
      }
    }
    Quand je commente les lignes avec gtk_check_menu_item_set_active, le programme ne plante pas, mais l'ancien menuitem activé reste activé, et celui sur lequel j'ai cliqué ne s'active pas.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Pas évident à répondre au vu de ton code. Je suppose que menuitem_s_classic et menuitem_s_cobalt sont des pointeurs déclarés en global .

    Tu peux déjà réduire ton code. Il n'est pas nécessaire de faire un callback pour chaque bouton. Un seul callback pour tous les boutons est suffisant puisque tu vas récupérer en premier argument du callback le pointeur sur le GtkRadioMenuItem qui l'a activé.
    Le fait de réduire ton code va te permettre dans un premier temps de réduire les possibilités d'erreur puisque ton code sera beaucoup plus court. Pense à donner le bon type de widget en premier argument à ton callback. Ce n'est pas GtkWidget mais GtkMenuItem.

    Pour finir j'utiliserais plutôt le signal "toggled" en lieu et place de "activate". À essayer...

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 56
    Points : 48
    Points
    48
    Par défaut
    Merci, j'ai fait un seul callback avec le signal "toggled" pour tous les menuitem et ça a résolut le problème.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/12/2006, 23h57
  2. Faire fonctionner des programmes sous Linux
    Par vviivvii dans le forum Mandriva / Mageia
    Réponses: 14
    Dernier message: 29/08/2006, 19h41
  3. impossible de faire fonctionner le gridlayout
    Par oceane751 dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 12/06/2006, 10h42
  4. Réponses: 5
    Dernier message: 22/03/2006, 10h39
  5. impossible de faire fonctionner phppgadmin et pgdmin3
    Par le_ben dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 09/12/2004, 14h27

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