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 text d'un label situé dans un eventbox


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
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut Récupérer le text d'un label situé dans un eventbox
    bonjour,

    J'ai placé un label dans un eventbox. Quand je clique dessus, je voudrais récupérer le widget label. Comment faire car dans le callback on récupère l'eventbox ??? J'ai pas réussi à trouver de tuto ni en francais ni en anglais sur google.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static gboolean on_eventbox_label_press_event_cb (GtkWidget *eventbox, GdkEvent  *event, gpointer data) {
        gchar texte[5];
        //GtkWidget *lab = le label situé dans l'eventbox
        g_sprintf(texte, "%s", gtk_label_get_text(GTK_LABEL(lab)));
        g_print("texte: %s", texte);
        return TRUE;
    }
    Merci d'avance pour vos réponses.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 41
    Par défaut
    Il y a get_child() mais je ne sais pas si ça fonctionne. A tester

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    ah oui !!!
    car eventbox est un gtkContainer.

    Merci bien, j'avais pas pensé à chercher de ce coté là.
    Je vais tester ça.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    J'ai pas réussi mais j'ai fait autrement, il suffit de mettre le label en paramètre dans le callback.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect (G_OBJECT(event_box), "button_press_event", G_CALLBACK(on_tw_cfl_label_press_event_cb), label);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static gboolean on_tw_cfl_label_press_event_cb (GtkWidget *eventbox, GdkEvent  *event, gpointer data) {
        GtkWidget *lab = data;
        gchar texte[5];
        g_sprintf(texte, "%s", gtk_label_get_text(GTK_LABEL(lab)));
        g_print("texte: %s", texte);
        return TRUE;
    }

  5. #5
    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
    Utilise plutôt g_signal_connect_swapped, qui inverse le premier paramètre avec user_data lors de l'appel de la calllback. En général on fait en sorte que l'objet qui est le "héros" de l'action soit le premier paramètre.

    Autre chose, 'utilisation de g_sprintf avec un buffer de taille fixe n'est pas très heureuse non plus, gtk_label_get_text te renvoie un const gchar * que tu peux utiliser directement. Là ton code pète s'il y a plus de 4 caractères dans le label.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    Merci pour tes remarques.

    C'est noté pour le signal swapped.
    Pour le label, il est prédéfini par moi et donc ne peut excéder 3 caractères. Du coup, j'ai pensé ne pas avoir besoin de faire plus.

    Je réouvre le sujet car au final, j'ai besoin de récupérer mon label situé dans l'eventbox.
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GtkWidget *child;
    child = gtk_container_get_children(eventbox);
    gchar texte[5];
    g_sprintf(texte, "%s", gtk_label_get_text(GTK_LABEL(child)));
    J'ai le message d'erreur suivant :
    GLib-GObject-WARNING **: invalid uninstantiable type '(null)' in cast to 'GtkLabel'

    On dirait donc que mon eventbox est vide ??? Pourtant non, voir le code suivant

    code en entier pour ceux qui veulent le compiler :
    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
    #include <gtk/gtk.h>
    #include <stdlib.h>
    // convertit un int en string
    int int_to_str(int value, char *buf, unsigned int len) {
    	unsigned result = 0;
    	if (!buf) return -1;
    #define ADDCHAR(chr) \
    	if (result < len - 1) \
    	{ \
    		*buf++ = (chr); \
    		result++; \
    	}
    	int j = 0;
    	char int_to_str[16];
    	if (value < 0) ADDCHAR('-');
    	char *ptr = int_to_str + sizeof(int_to_str) - 1;
    	do {
    		int modulo = value % 10;
    		modulo = (modulo<0)?-modulo:modulo;
    		*ptr-- =  modulo + '0';
    		value /= 10;
    		j++;
    	} while (value);
     
    	for (; j > 0; j--) ADDCHAR(int_to_str[sizeof(int_to_str) - j]);
    	*buf = '\0';
    	return 0;
    }
     
    typedef struct {
        double cfl;
        char *callsign;
    } s_plane;
     
    static gboolean on_cfl_label_press_event_cb (GtkWidget *eventbox, GdkEvent  *event, gpointer data) {
        GtkWidget *label = data;
        gchar texte[5];
        GtkWidget *child;
        child = gtk_container_get_children(eventbox);
        g_sprintf(texte, "%s", gtk_label_get_text(GTK_LABEL(child)));
        g_print("CFL: %s\n", texte);
        return TRUE;
    }
     
    int main(int argc, char *argv[])
    {
        GtkWidget *window, *scr_win, *grid;
        s_plane *plane;
        plane->cfl = 320.0;
        plane->callsign = "BAW4237";
        gtk_init(&argc, &argv);
     
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
        gtk_window_set_default_size(GTK_WINDOW(window), 150, 150);
        gtk_window_set_title(GTK_WINDOW(window), "Test");
     
        grid = gtk_grid_new();
        int i, j;
        j=0;
        GtkWidget *label[12], *event_box[12];
        char *str_lab = malloc(sizeof(char[5]));
     
        for (i=650; i>410; i=i-20) {
            int_to_str(i, str_lab, 4);
            label[j] = gtk_label_new(str_lab);
            gtk_widget_set_size_request(label[j], 100, 14);
            event_box[j] = gtk_event_box_new();
            gtk_container_add(GTK_CONTAINER(event_box[j]), label[j]);
            gtk_grid_attach(GTK_GRID (grid), event_box[j], 0, j, 1, 1);
            g_signal_connect (G_OBJECT(event_box[j]), "button_press_event", G_CALLBACK(on_cfl_label_press_event_cb), label[j]);
            j++;
        }
     
        free(str_lab);
        scr_win = gtk_scrolled_window_new(NULL, NULL);
        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scr_win), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
        gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW (scr_win), grid);
        gtk_container_add(GTK_CONTAINER(window), scr_win);
     
        g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window));
     
        gtk_widget_show_all(window);
        gtk_main();
        return 0;
    }

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/08/2013, 17h42
  2. Réponses: 18
    Dernier message: 13/06/2012, 08h07
  3. Réponses: 2
    Dernier message: 11/12/2011, 14h41
  4. récupérer le texte d'un label contenu dans un frame
    Par bringer dans le forum Tkinter
    Réponses: 5
    Dernier message: 18/06/2009, 22h22
  5. Réponses: 0
    Dernier message: 12/10/2008, 16h37

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