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 :

Changer le label d'un bouton après sélection d'un texte dans une comboboxentry


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Points : 63
    Points
    63
    Par défaut Changer le label d'un bouton après sélection d'un texte dans une comboboxentry
    Bonjour, je suis débutant en GTK et j'aimerais savoir comment on peut changer le label d'un bouton après sélection d'un texte dans une comboboxentry.

    Voici mon code :
    Code C : 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
    // création de la combobox
    comboboxentry1 = gtk_combo_box_entry_new_text ();
      gtk_widget_show (comboboxentry1);
      gtk_table_attach (GTK_TABLE (table55), comboboxentry1, 0, 1, 1, 2,
                        (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
                        (GtkAttachOptions) (GTK_FILL), 0, 0);
      gtk_widget_set_size_request (comboboxentry1, 14, -1);
      gtk_combo_box_append_text (GTK_COMBO_BOX (comboboxentry1), _("MANON"));
      gtk_combo_box_append_text (GTK_COMBO_BOX (comboboxentry1), _("SOPHIE"));
      gtk_combo_box_set_focus_on_click (GTK_COMBO_BOX (comboboxentry1), FALSE);
     
    // Création du bouton
    btn_Action = gtk_button_new_with_mnemonic ("");
      gtk_widget_show (btn_Action);
      gtk_table_attach (GTK_TABLE (table55), btn_Action, 0, 1, 0, 1,
                        (GtkAttachOptions) (GTK_FILL),
                        (GtkAttachOptions) (0), 0, 0);
      gtk_widget_set_size_request (btn_Action, 100, 35);
     
    // envoi du signal
    g_signal_connect_swapped ((gpointer) comboboxentry1, "changed",
                                G_CALLBACK (on_comboboxentry1_changed),
                                GTK_OBJECT (btn_Action));
     
    // fonction on_comboboxentry1_changed
    void
    on_comboboxentry1_changed              (GtkComboBox     *combobox,
                                            gpointer         user_data)
    {
    	gchar *sText;
     
    	GtkWidget * btn = lookup_widget(GTK_WIDGET(user_data),"btn_Action");
     
    	sText = gtk_combo_box_get_active_text(GTK_COMBO_BOX(combobox));
     
    	gtk_button_set_label(GTK_BUTTON(btn),sText);
    }

    Voilà.
    Pour résumer, si je sélectionne "Manon" j'aimerais que mon bouton prenne le label "Manon".

  2. #2
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Points : 208
    Points
    208
    Par défaut
    es-tu sur que tu entres bien dans la fonction de callback ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Points : 63
    Points
    63
    Par défaut
    Oui !!! c'est la première chose que j'ai vérifié. Lors d'un debug, je m'arrete bien au point d'arret que j'avais au préalable placé dans la fonction de callback.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Points : 63
    Points
    63
    Par défaut
    J'ai résolu mon problème. Il suffit de modifier la fonction de callback de la manière suivante:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    void
    on_comboboxentry1_changed              (GtkComboBox     *combobox,
                                            gpointer         user_data)
    {
    	gchar *sText;
    	
    	GtkWidget *btn = lookup_widget(GTK_WIDGET(user_data),"btn_Test");
    	GtkWidget *cb = lookup_widget(GTK_WIDGET(combobox),"comboboxentry1");
    	
    	sText = gtk_combo_box_get_active_text(GTK_COMBO_BOX(cb));	
    	gtk_button_set_label(GTK_BUTTON(btn),sText);
    	
    }

    Si cela peut aider qqn !!!
    Cordialement.

  5. #5
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Points : 208
    Points
    208
    Par défaut
    Logiquement, lors de l'appel à ta fonction callback tu devrais avoir comme premier paramètre, la GtkComboBox à laquelle tu as connecté le signal, et comme second paramètre (ton gpointer user_data) le bouton sur lequel tu as cliqué.
    Tu n'as donc pas besoin d'appeller la fonction lookup_widget !!

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par bit_o Voir le message
    Logiquement, lors de l'appel à ta fonction callback tu devrais avoir comme premier paramètre, la GtkComboBox à laquelle tu as connecté le signal, et comme second paramètre (ton gpointer user_data) le bouton sur lequel tu as cliqué.
    Tu n'as donc pas besoin d'appeller la fonction lookup_widget !!
    Sauf que la fonction g_signal_connect_swapped inverse l'ordre des paramètres, donc le prototype devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void on_comboboxentry1_changed (gpointer user_data, GtkComboBox *combobox)

  7. #7
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Points : 208
    Points
    208
    Par défaut
    Citation Envoyé par gege2061 Voir le message
    Sauf que la fonction g_signal_connect_swapped inverse l'ordre des paramètres, donc le prototype devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void on_comboboxentry1_changed (gpointer user_data, GtkComboBox *combobox)
    soit, mais l'idée reste la même quant au fait qu'il n'a pas à faire le lookup_widget(..) pour récupérer ces GtkWidget's !

    merci pour l'info sur le signal _swapped au passage

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par bit_o Voir le message
    soit, mais l'idée reste la même quant au fait qu'il n'a pas à faire le lookup_widget(..) pour récupérer ces GtkWidget's !

    merci pour l'info sur le signal _swapped au passage

    Citation Envoyé par gege2061 Voir le message
    Sauf que la fonction g_signal_connect_swapped inverse l'ordre des paramètres, donc le prototype devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void on_comboboxentry1_changed (gpointer user_data, GtkComboBox *combobox)
    Les deux idées sont justes. Merci pour l'information. En fait j'utilise glade pour générer le code de l'interface et ce dernier me génère un prototype faux comme l'exemple ci-dessous comme s'il utilisait la fonction g_signal_connect:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void on_comboboxentry1_changed ( GtkComboBox *combobox,gpointer user_data)
    au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void on_comboboxentry1_changed (gpointer user_data, GtkComboBox *combobox)
    A cause de cela, je n'arrivais pas à récupérer mes objets sans lookup_widget(..)
    Enfin le lookup_widget(..) permet que cela fonctionne dans les deux cas d'utilisation (avec g_signal_connect et g_signal_connect_swapped) même s'il est embetant de ne pas utiliser proprement ces deux dernières fonctions

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/10/2011, 00h52
  2. [SwingWorker]Changer le label d'un bouton pendant un traitement
    Par lirycs78 dans le forum EDT/SwingWorker
    Réponses: 1
    Dernier message: 19/06/2011, 16h20
  3. Changer le label d'un bouton
    Par zulad dans le forum Flex
    Réponses: 9
    Dernier message: 06/10/2010, 08h35
  4. Réponses: 1
    Dernier message: 15/01/2010, 15h41
  5. [W3C] [form] Changer le label d'un bouton
    Par GLDavid dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 11/07/2007, 09h51

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