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 :

Récupérer le texte d'un entry quand on appuie sur un bouton


Sujet :

GTK+ avec C & C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 29
    Points : 13
    Points
    13
    Par défaut Récupérer le texte d'un entry quand on appuie sur un bouton
    Bonjour,

    Voilà je n'arrive pas à récupérer le texte rentré par l'utilisateur dans un entry quand ce dernier appuie sur un bouton.

    Pour le moment, quand l'utilisateur appuie sur le bouton la fonction "maj_label" se lance avec pour données mon Text Entry.
    Aperçu du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void maj_label (GtkWidget *window, gpointer user_data)
    {
    	gchar *text = (char *)user_data;
    	g_print("%s\n",text);
     
    }
    Merci de votre aide

    Ludo

  2. #2
    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
    Points : 2 002
    Points
    2 002
    Par défaut
    Bonjour, tu pourrais nous montrer aussi le code de connexion du signal de clic sur le boutton ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Oui bien sur

    Je travaille avec anjuta / glade donc ça ressemble à ça (cf pièce jointe)

    Le code complet :
    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
    #include <config.h>
    #include <gtk/gtk.h>
     
     
    #include <glib/gi18n.h>
     
    #define UI_FILE "src/projet_c.ui"
     
    /* Called when the window is closed */
    void
    destroy (GtkWidget *widget, gpointer data)
    {
    	gtk_main_quit ();
    }
     
    static GtkWidget*
    create_window (void)
    {
    	GtkWidget *window;
    	GtkBuilder *builder;
    	GError* error = NULL;
     
    	/* Load UI from file */
    	builder = gtk_builder_new ();
    	if (!gtk_builder_add_from_file (builder, UI_FILE, &error))
    	{
    		g_warning ("Couldn't load builder file: %s", error->message);
    		g_error_free (error);
    	}
     
    	/* Auto-connect signal handlers */
    	gtk_builder_connect_signals (builder, NULL);
     
    	/* Get the window object from the ui file */
    	window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
    	g_object_unref (builder);
     
    	return window;
    }
     
    void maj_label (GtkWidget *window, gpointer user_data)
    {
    	gchar *text = (char *)user_data;
    	g_print("%s\n",text);
     
    }
     
    int
    main (int argc, char *argv[])
    {
    	GtkWidget *window;
     
    #ifdef ENABLE_NLS
    	bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
    	bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
    	textdomain (GETTEXT_PACKAGE);
    #endif
     
    	gtk_init (&argc, &argv);
     
    	window = create_window ();
    	gtk_widget_show (window);
     
    	gtk_main ();
    	return 0;
    }
    Merci de votre réponse
    Images attachées Images attachées  

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 293
    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 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    Deux possibilités au problème rencontré:
    1. Tu ne transmets pas le GtkEntry en tant que donnée utilisateur lors de l'appel à g_signal_connect();
    2. Les signaux ne sont pas affectés lors de la création de l'interface.

    Je pars du principe que la 2ème possibilité n'est pas celle-là. Il faut donc regarder du côté du pointeur utilisateur.
    Si tu utilises le signal "activate" alors le prototype du CALLBACK te permet d'accéder directement au GtkEntry:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void                user_function                      (GtkEntry *entry,
                                                            gpointer  user_data)
    un simple printf("%s\n", gtk_entry_get_text(entry)); devrait suffire à te contenter .

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Hum, je ne comprend pas votre réponse. Désolé =/


    Mon problème c'est que je n'arrive pas à accéder à mon entry car j'ai créé mon interface avec glade du coup je n'ai accès qu'à ma fenêtre, et je ne sais pas comment récupérer mes widgets à partir de ma fenêtre...

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 293
    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 293
    Points : 4 943
    Points
    4 943
    Billets dans le blog
    5
    Par défaut
    Dans Glade tu peux donner des noms à tes widgets. D'ailleurs Glade les nomme par défaut.

    Par exemple pour ton GtkEntry tu peux avoir comme nom "entry01".

    Dans ton code C il te suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GtkEntry *entry = (GtkEntry*) gtk_builder_get_object(builder, "entry01");
    Tu récupères ainsi le pointeur de ton GtkEntry. Ensuite un simple gtk_entry_get_text(entry); te permet de récupérer les données entré par l'utilisateur.

  7. #7
    Membre actif Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Points : 221
    Points
    221
    Par défaut
    Il y a une autre solution, c'est de spécifier la fonction de rappel dans Glade avec l'onglet signaux du widget sélectionné. Par contre dans ce cas le user_data (spécifié avec gtk_builder_connect_signals) pointera vers le même emplacement. L'avantage c'est que ça t'évite à d'avoir à appeler appeler plusieurs fois g_signal_connect. L'inconvénient c'est que tu dois passer les mêmes données aux fonctions de rappel, aussi si tu changes le nom de tes fonctions, faut penser à changer dans Glade aussi.

    Donc la solution de Gerald est plus souple, juste vaut mieux utiliser les macros pour faire les cast, ça permet de retrouver les erreurs plus facilement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GtkWidget *entry = GTK_WIDGET(gtk_builder_get_object(builder, "entry01"));

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Merci pour vos réponses, mon problème est résolu

    Au final j'utilise des g_signal_connect dans lesquels je met mon builder en paramètre (je vois mieux ce que j'ai comme données comme ça ^^)

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/09/2012, 20h39
  2. Temps quand on appuie sur un bouton
    Par makflai dans le forum LabVIEW
    Réponses: 0
    Dernier message: 14/07/2010, 12h27
  3. Réponses: 4
    Dernier message: 22/05/2008, 19h01
  4. Créer un JLabel et JComboBox quand on appuie sur un bouton
    Par maxkarting25 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 16/05/2008, 18h26
  5. Réponses: 1
    Dernier message: 02/03/2008, 21h34

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