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 :

Modification d'un label cliquable dans une même fenêtre


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Par défaut Modification d'un label cliquable dans une même fenêtre
    Bonsoir,

    J'aimerais en fait modifier un "label cliquable" dans une même fenêtre après avoir cliqué dessus, mais j'ai des problèmes avec ma fonction callback .

    Bien que le programme compile et que le label cliquable s'affiche, lorsque l'on clique dessus, il apparait une erreur d'exécution... Quelqu'un pourrait-il m'aider ?

    Voici mon 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
    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
    #include <gtk/gtk.h>
     
    void modifierlabel (GtkWidget *wid, gpointer data);
     
    int main (int argc, char *argv[])
    {
        GtkWidget *window;
        GtkWidget *event_box;
        GtkWidget *label;
     
        gtk_init (&argc, &argv);
     
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
     
        gtk_window_set_title (GTK_WINDOW (window), "Label");
     
        g_signal_connect (G_OBJECT (window), "destroy",
                            G_CALLBACK (gtk_main_quit), NULL);
     
        gtk_container_border_width (GTK_CONTAINER (window), 10);
     
        /* Création d'un EventBox et ajout de celui-ci dans la fenêtre. */
     
        event_box = gtk_event_box_new ();
        gtk_container_add (GTK_CONTAINER(window), event_box);
        gtk_widget_show (event_box);
     
        /* Création d'un long label */
     
        label = gtk_label_new ("Cliquez ici ");
        gtk_container_add (GTK_CONTAINER (event_box), label);
        gtk_widget_show (label);
     
        /* Attachement d'une action à celui-ci. */
     
        gtk_widget_set_events (event_box, GDK_BUTTON_PRESS_MASK);
        gtk_signal_connect (GTK_OBJECT(event_box), "button_press_event",
                            GTK_SIGNAL_FUNC (modifierlabel), label);
     
     
        gtk_widget_realize (event_box);
        gdk_window_set_cursor (event_box->window, gdk_cursor_new (GDK_HAND2));
     
        gtk_widget_show (window);
     
        gtk_main ();
     
        return 0;
    }
     
    void modifierlabel (GtkWidget *wid, gpointer data) {
     
         GtkWidget *plabel = data;
         gtk_label_set_label (GTK_LABEL(plabel), "C est ici");
     
         gtk_widget_show (wid);
     
         gtk_container_add (GTK_CONTAINER (wid), plabel);
         gtk_widget_show (plabel); }

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Salut !


    Plusieurs fautes par ci par là... Un callback s'enregistre de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    g_signal_connect (
       G_OBJECT (event_box), "button-press-event",
       G_CALLBACK (modifierlabel), label
    );
    Et donc avec la fonction g_signal_connect et non pas gtk_signal_connect qui elle est dépréciée, donc à ne plus utiliser. De même le nom de l'événement était mal écrit, il faut mettre de - et non pas des _ entre chaque mots, et de même encore une fois pour passer un callback en argument, on utilise la macro G_CALLBACK !

    Je ne sais pas où tu as lu ton cours mais jète le à la poubelle

    Venons en à ton callback ! Si tu prend une minute ou deux pour regarder dans la ref officielle de l'API GTK+, tu aurais pû voir que le prototype du callback button-press-event à la signature suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    gboolean    user_function                  (GtkWidget      *widget,
                                                GdkEventButton *event,
                                                gpointer        user_data)
    Il conviens (comme je le répète sans arrêt sur ce forum) de respecter la signature des callback sous peine d'avoir ce genre de problèmes qui je le pensais, allais un jour tomber sur quelqu'un. Ta fonction est donc la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    gboolean modifierlabel (GtkWidget *wid, GdkEventButton * event, gpointer data)
    {
       GtkWidget *plabel = data;
       gtk_label_set_label (GTK_LABEL(plabel), "C est ici");
     
       (void) event;
       (void) wid;
     
       return FALSE;
    }
    De plus, dans ta fonction originale je ne vois pas pourquoi tu veux afficher des widgets qui le sont déjà et pourquoi également tu veux affecter un widget à un autre alors qu'il l'est déjà. Ceci sont des actions que tu n'as besoin de faire qu'une seule fois, lors de leur création/mise en place mais pas à chaque fois que tu change le titre d'un GtkLabel ou autre widget !


    Voilà, problème résolu
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Par défaut
    Merci encore!

    Pour la fonction callback, je le savais, mais j'avais oublié de le changer...
    Bonne journée!

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par simtim
    Pour la fonction callback, je le savais, mais j'avais oublié de le changer...
    Bni t'aurais dû le faire car ton plantage viens surtout de là avant tout
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

Discussions similaires

  1. ouvrir un répertoire d'image et d'afficher son contenu dans une même fenêtre
    Par pianetdi dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 12/04/2010, 16h12
  2. Deux images dans une même fenêtre
    Par ambessa dans le forum OpenCV
    Réponses: 3
    Dernier message: 23/06/2008, 17h54
  3. Deux JGraph dans une même fenêtre ?
    Par Didom dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 10/04/2008, 15h00
  4. Réponses: 11
    Dernier message: 15/09/2006, 19h39
  5. VMR9 : deux vidéos != dans une même fenêtre.
    Par LapinGarou dans le forum MFC
    Réponses: 4
    Dernier message: 12/04/2006, 19h45

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