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 :

[GTK+] Modifier une liste via une fonction callback [Débutant(e)]


Sujet :

GTK+ avec C & C++

  1. #1
    Membre actif
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Points : 243
    Points
    243
    Par défaut [GTK+] Modifier une liste via une fonction callback
    Bonjour à tous,

    Je me suis intéressé à la création de listes.
    Je me demandais comment en modifier une via une fonction callback.

    Je pensais créer une structure comportant le GtkListStore, et passer l'adresse de cette structure en dernier argument de g_signal_connect(). Pourrais-je ainsi modifier le contenu du magasin ? L'affichage de la liste sera-t-il mis à jour automatiquement ?

    J'espère avoir été assez clair.
    Par avance, merci.

  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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par odsen.s
    Bonjour à tous,

    Je me suis intéressé à la création de listes.
    Je me demandais comment en modifier une via une fonction callback.

    Je pensais créer une structure comportant le GtkListStore, et passer l'adresse de cette structure en dernier argument de g_signal_connect(). Pourrais-je ainsi modifier le contenu du magasin ? L'affichage de la liste sera-t-il mis à jour automatiquement ?

    J'espère avoir été assez clair.
    Par avance, merci.
    Oui ceci peut fonctionner sans problème

  3. #3
    Membre actif
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Points : 243
    Points
    243
    Par défaut
    Waow, je m'attendais à des tas de complications
    Merci beaucoup Franck.

  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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par odsen.s
    Waow, je m'attendais à des tas de complications
    Merci beaucoup Franck.
    Tant que tu récupère un pointeur du type de ta structure dans ton callback par rapport au dernier argument il n'y a pas de problèmes

  5. #5
    Membre actif
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Points : 243
    Points
    243
    Par défaut
    Citation Envoyé par Franck.H
    Tant que tu récupère un pointeur du type de ta structure dans ton callback par rapport au dernier argument il n'y a pas de problèmes
    Hum, justement, ça me pose un problème ici.
    Faut-il que je déclare ma fonction callback comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void cb(GtkWidget *p_widget, gpointer user_data, MaStructure * Structure)

  6. #6
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Nan surtout pas, il faut toujours respecter les signatures des fonctions imposées par GTK+ donc par exemple si ton callback est celui d'un GtkButton et appelé par l'événement "clicked":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void cb_clicked (GtkWidget * wid, gpointer data)
    {
       /* Recupere ici un pointeur sur ta structure passee en
           dernier argument de g_signal_connect: */
       MaStructure * st = data;
    }
    Après tu fait ce que tu veux

  7. #7
    Membre actif
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Points : 243
    Points
    243
    Par défaut
    Aaaaah d'accord !
    J'essayais d'utiliser directement la variable data, ça ne risquait pas de fonctionner.

    Je pense que maintenant je vais pouvoir me débrouiller, merci bien

  8. #8
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par odsen.s
    Aaaaah d'accord !
    J'essayais d'utiliser directement la variable data, ça ne risquait pas de fonctionner.

    Je pense que maintenant je vais pouvoir me débrouiller, merci bien
    Bin le pointeur data non tu ne peux pas l'utiliser directement, rappel toi de tes cours de C, un pointeur de type void* ne peut-être déréférencé et le type gpointer n'est rien de plus que ca

  9. #9
    Membre actif
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Points : 243
    Points
    243
    Par défaut
    un pointeur de type void* ne peut-être déréférencé et le type gpointer n'est rien de plus que ca
    Ok

    Je me permet de relancer la discussion, le problème que j'ai maintenant étant directement lié avec ce qui précède.

    Voici le code de ma fonction callback, chargée de modifier une liste :
    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
     
    #include <stdio.h>
    #include <stddef.h>
     
    void cb_ouvrir(GtkWidget *p_widget, gpointer user_data)
    {
       /* on recupere les donnees passees a la fonction */
       st_cb *p_cb = user_data;   
     
       Operation op;   
       GtkTreeIter iter;   
       size_t i;   
     
       /* provisoire : ouverture du fichier de test */
       p_cb->fp_compte = fopen("test","r+");
     
       /* cette boucle recupere des donnees a partir d'un fichier et les
           ecrit dans la structure op tant que c'est possible */
       for(i = 0; lire_operation_fmt(p_cb->fp_compte, i+1, &op) == OK; i++)
       {
          /* ajout de la ligne */      
          gtk_list_store_append(p_cb->p_store, &iter);
          gtk_list_store_set
             (p_cb->p_store, &iter, 0, op.s_date, 1, op.montant, 2, op.s_motif,
             3, op.solde, -1);
       }   
     
       (void)p_widget;
    }
    Avec les détails de la structure Operation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct Operation
    {
       char s_date[LONG_DATE];   
       double montant;
       char s_motif[LONG_MOTIF];   
       double solde;
    } Operation;
    Et la structure utilisée pour les fonctions callback :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct
    {
       FILE *fp_compte;
       GtkListStore *p_store;
    }st_cb;
    Voici l'erreur donnée par GTK+:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (gestion_budgets_GTK+.exe:2900): Gtk-CRITICAL **: gtk_list_store_append: assertion `GTK_IS_LIST_STORE (list_store)' failed
     
    (gestion_budgets_GTK+.exe:2900): Gtk-CRITICAL **: gtk_list_store_set: assertion `GTK_IS_LIST_STORE (list_store)' failed
    A quoi cette erreur peut bien correspondre ?
    C'est gtk_list_store_append qui ne reconnaît pas p_cb->p_store comme un magasin valide ?

    Merci

  10. #10
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Comment est initialisé ton GtkListStore ? C'est vrai que cette erreur est bizarre d'autant plus que le type de ton widget dans la structure est bien un GtkListStore

    Au pire essaye avec la macro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_list_store_append (GTK_LIST_STORE (p_cb->p_store), &iter);
    mais normalement il n'y a pas lieu de le faire !

  11. #11
    Membre actif
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Points : 243
    Points
    243
    Par défaut
    J'initialise le magasin comme ceci dans ma fonction principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    st_cb cb;
     
    /* creation magasin */
    cb.p_store = gtk_tree_store_new(NB_COLONNES,
                               G_TYPE_STRING,G_TYPE_DOUBLE,
                               G_TYPE_STRING,G_TYPE_DOUBLE);
    avec NB_COLONNES qui vaut 4.

    J'avais déjà essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_list_store_append (GTK_LIST_STORE (p_cb->p_store), &iter);
    , mais j'obtiens une erreur supplémentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (gestion_budgets_GTK+.exe:2688): GLib-GObject-WARNING **: invalid cast from `GtkTreeStore' to `GtkListStore'

  12. #12
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Bin c'est malin ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* creation magasin */
    cb.p_store = gtk_tree_store_new(NB_COLONNES,
                               G_TYPE_STRING,G_TYPE_DOUBLE,
                               G_TYPE_STRING,G_TYPE_DOUBLE);


    Ainsi ca fonctionnera sans doute mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* creation magasin */
    cb.p_store = gtk_list_store_new(NB_COLONNES,
                               G_TYPE_STRING,G_TYPE_DOUBLE,
                               G_TYPE_STRING,G_TYPE_DOUBLE);

  13. #13
    Membre actif
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Points : 243
    Points
    243
    Par défaut
    Citation Envoyé par Franck.H
    Bin c'est malin ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* creation magasin */
    cb.p_store = gtk_tree_store_new(NB_COLONNES,
                               G_TYPE_STRING,G_TYPE_DOUBLE,
                               G_TYPE_STRING,G_TYPE_DOUBLE);
    Aïe, oui, je le mérite

    Ca fonctionne beaucoup mieux du coup.
    L'affichage est mis à jour tout seul, c'est vraiment la classe !
    GTK+ me paraît moins compliqué qu'avant.

    Merci pour ton aide

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

Discussions similaires

  1. Modifier le style d'une page dans une frame via une autre frame
    Par Menontona dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/12/2011, 18h54
  2. Réponses: 1
    Dernier message: 22/12/2009, 20h05
  3. Réponses: 2
    Dernier message: 16/11/2007, 11h44
  4. PHP Passer une variable via une liste deroulante
    Par lepierre dans le forum Langage
    Réponses: 3
    Dernier message: 20/10/2006, 12h09
  5. Ajouter une ligne dans une liste via un POPUP
    Par seblo_scoqi dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/01/2005, 16h20

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