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 :

probleme avec g_signal_connect


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Par défaut probleme avec g_signal_connect
    Bonjour,

    Je debute sous GTK+ et je ne comprends pas vraiment l'utilisation de la fonction g_signal_connect.
    En effet, j'ai cree un bouton et j'appelle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_signal_connect (G_OBJECT (p_button), "clicked", G_CALLBACK(cb_open), pInput);
    ou pInput est un tableau de GtkEntry. En fait j'aimerai charger un fichier texte et mettre chaque valeur dans chaque case de mon tableau.

    Dans cb_open j'ai :

    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
     
    void cb_open (GtkWidget *p_widget, Grid g, gpointer user_data)
    {
      GtkWidget *p_dialog = NULL;
     
      p_dialog = gtk_file_chooser_dialog_new ("Ouvrir un fichier", NULL,
                                              GTK_FILE_CHOOSER_ACTION_OPEN,
                                              GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                              GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
                                              NULL);
      if (gtk_dialog_run (GTK_DIALOG (p_dialog)) == GTK_RESPONSE_ACCEPT)
      {
        gchar *file_name = NULL;
     
        file_name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (p_dialog));
     
        load_file_gtk(file_name,&g,user_data);
        g_free (file_name), file_name = NULL;
      }
      gtk_widget_destroy (p_dialog);
     
      /* Parametre inutilise */
      (void)p_widget;
    }
    ou load_file_gtk prend le nom du fichier, mon type grille et mon tableau de GtkEntry.

    Ou est-ce que je fais une erreur ? Je n'ai pas vraiment compris le dernier parametre de la fonction g_signal_connect et comment les parametres etaient passes au handler cb_open...

    Merci pour votre aide !

  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 !


    Le prototype de ton callback n'est pas bon, je le répète sans arrêt, il faut respecter les signature des des signaux fournits par GTK+ autrement vos arguments seront passés n'importe comment !

    Corrigé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void cb_open (GtkButton *p_widget, gpointer user_data)
    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 éclairé Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Par défaut
    D'accord mais alors comment puis-je faire pour utiliser ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    load_file_gtk(file_name,&g,user_data);
    dans cb_open ?
    J'ai vu qu'il fallait passer par une structure mais concretement je ne vois pas comment g_signal_connect fonctionne...
    Comment m'y prendre ?

    Merci de votre aide.

  4. #4
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Salut

    Non le callback ne peut prendre 3 arguments. Il en prendra deux, il faut bien regarder le code de Franck.

    Si c'est un tableau de GtkEntry et que tu veux accéder au tableau entier dans le callback tu devrais essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect (G_OBJECT (p_button), "clicked", G_CALLBACK(cb_open), (GtkEntry*) pInput);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void cb_open (GtkWidget *w, GtkWidget *pInput_array)
    {
      //...
      gtk_entry_get_text (pInput_array[0]);
    }
    Mais ici, tu veux passer un pointeur de structure qui contient les types grid et GtkEntry, donc voici un exemple dont le principe peut aider:
    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
     
    #include <gtk/gtk.h>
     
    typedef struct {
     gchar *name;
     gint age;
    } person;
     
    static void callback(GtkWidget *widget, person *x)
    {
      g_print ("name:%s age:%d\n", x->name, x->age);
    }
     
    int main (int argc, char **argv)
    {
      GtkWidget *window, *button;
     
      gtk_init (&argc, &argv);
     
      // Create window
      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      g_signal_connect (G_OBJECT (window), "destroy",G_CALLBACK (gtk_main_quit), NULL);
      gtk_container_set_border_width (GTK_CONTAINER (window), 10);
     
      // array of structures
      person *friends[2];
     
      // populate it
      friends[0] = (person*) g_malloc(sizeof(person));
      friends[0]->name = g_strdup("Joe");
      friends[0]->age  = 25;
     
      friends[1] = (person*) g_malloc(sizeof(person));
      friends[1]->name = g_strdup("Bill");
      friends[1]->age  = 32;
     
      // Create the button and pass values of a person to it
      button = gtk_button_new_with_label ("infos button");
      g_signal_connect (G_OBJECT(button), "clicked",
                        G_CALLBACK(callback), (person*)friends[0]);
     
      gtk_container_add(GTK_CONTAINER(window), button);
      gtk_widget_show_all (window);
     
      gtk_main ();
     
      g_free(friends);
      return 0;
    }
    C'est vrai que c'est une question essentielle et récurrente, une bonne idée de tuto.

  5. #5
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Lunixinclar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect (G_OBJECT (p_button), "clicked", G_CALLBACK(cb_open), (GtkEntry*) pInput);
    si tu veux faire un cast pour le dernier paramètre, utilise le bon type : gpointer !

    Citation Envoyé par Lunixinclar
    C'est vrai que c'est une question essentielle et récurrente, une bonne idée de tuto.
    Effectivement, une question pour la FAQ est prévue, ça évitera de répéter toujours la même chose

  6. #6
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Tu peux justifier en reprenant l'exemple que j'ai posté, en castant un pointeur de tableau de structure en gpointer?

    Le prototype est clair: http://developer.gnome.org/doc/API/2...signal-connect

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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