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 :

Problème avec gtk_tree_model_foreach


Sujet :

GTK+ avec C & C++

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut Problème avec gtk_tree_model_foreach
    Bonjour a tous!
    Je cherche à programmer une application C avec GTK+ mais j'ai un soucis au niveau d'un GTK_LIST_STORE.
    J'ai donc un GTK_LIST_STORE que j'ai appellé pListStore avec deux colonnes : une colonne contenant une chaine de caractères et une autre contenant un entier.
    Ce que j'aimerais faire c'est qu'au moment où j'appuie sur entrée, il y ait une recherche au niveau de la colonne des entiers et si il y a un entier égal à 3 il supprime la cellule du GTK_LIST_STORE où se situe le 3.

    Voila ce que j'ai essayé de faire :
    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
     
    gboolean foreach_func(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data)
    {
       	gchar * p_nom;
    	gint * nb;
     
     
    	gtk_tree_model_get (model, iter,0, & p_nom,1, & nb,-1);
     
    	if(*nb == 3)
    	{
    		gtk_list_store_remove (GTK_LIST_STORE(model), iter);
    	}
     
        return FALSE; 
    }
    Et dans la fonction callback pour le signal "activate" j'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gtk_tree_model_foreach(GTK_TREE_MODEL(pListStore), foreach_func, NULL);
    A l'exécution, j'ai une erreur de segmentation sur la fonction foreach_func.

    Merci d'avance pour vos réponses.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Ca n'est pas dit explicitement dans la doc, mais je ne serais pas surpris que les modifications du modèle (en particulier les suppressions) soient interdites lorsque tu fait un _foreach dessus. Ca aide si tu enleves le gtk_list_store_remove de ton foreach_func ?

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Effectivement, si j'enlève gtk_list_store_remove ça ne me mets pas d'erreur. Mais si je met à la place un simple g_printf, ça plante aussi.
    N'y aurait-il pas un autre moyen que celui-ci pour effectuer ce que je veux?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Ton int *nb; me semble louche, tu ne voulais pas plutôt faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    gint nb;
     
    gtk_tree_model_get (model, iter,0, & p_nom,1, & nb,-1);
     
    if(nb == 3) {
        ....
    }

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    OUF! Merci beaucoup! c'était bien un problème d' initialisation. Ca marche maintenant, on peut modifier le model avec un foreach.
    Merci encore!

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Bonjour!
    J'ai été un peu vite en disant que mon problème était résolu bien qu'il le soit en grande partie.
    Avec la correction du code ci-dessus, j'arrive bien à modifier le GTK_LIST_STORE mais j'ai tout de même une erreur. C'est un problème avec l'itérateur je pense.
    Voila ce que ça me donne au moment de la suppression de la cellule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Gtk-CRITICAL **: gtk_list_store_iter_next: assertion `GTK_LIST_STORE (tree_model)->stamp == iter->stamp' failed
    J'ai lu autre part qu'il faut récupérer l'état de l'itérateur mais je n'ai pas trop bien saisie le concept.

    j'ai tout de même tenté ceci :

    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
     
    gboolean foreach_func(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data)
    {
       	gchar * p_nom;
    	gint  nb;
     
     
    	if (gtk_tree_model_get_iter (model, iter, path))
            {
    	           gtk_tree_model_get (model, iter,0, & p_nom,1, & nb,-1);
     
    	            if(nb == 3)
    	             {
    		                gtk_list_store_remove (GTK_LIST_STORE(model), iter);
    	             }
             }
     
        return FALSE; 
    }
    Cela me renvoie quand même l'erreur d'itérateur.

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Par défaut
    Je crois avoir eu le même problème, mais comme je suis en chantier partout je ne sais plus si je l'ai résolu :s
    Mais je crois me souvenir qu'il faut que tu testes que l'iter n'est pas le dernier du modèle, car dans ce cas tu dois "arrêter" le foreach; si ma mémoire est bonne, la callback doit renvoyer true pour signifier la fin.
    enfin il me semble

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Ou bien la modification du modèle dans un foreach n'est pas autorisée...

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Citation Envoyé par drKzs Voir le message
    Je crois avoir eu le même problème, mais comme je suis en chantier partout je ne sais plus si je l'ai résolu :s
    Mais je crois me souvenir qu'il faut que tu testes que l'iter n'est pas le dernier du modèle, car dans ce cas tu dois "arrêter" le foreach; si ma mémoire est bonne, la callback doit renvoyer true pour signifier la fin.
    enfin il me semble
    Merci! Tu as raison! Je n'est plus d'erreur.

    Voici ce que j'ai fait.

    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
     
    gboolean foreach_func(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data)
    {
       	gchar * p_nom;
    	gint  nb;
     
     
    	if (gtk_tree_model_get_iter (model, iter, path))
            {
    	           gtk_tree_model_get (model, iter,0, & p_nom,1, & nb,-1);
     
    	            if(nb == 3)
    	             {
    		                if(gtk_list_store_remove (GTK_LIST_STORE(model), iter) == FALSE)
                                     {
                                                     return TRUE;
                                     }
    	             }
             }
     
        return FALSE; 
    }
    Par contre j'ai une autre question.

    Ma fonction fonctionne très bien s'il y a une ou deux cellules à supprimer mais s'il y en a plus, il faut que je m'y reprenne à plusieurs fois pour que toutes les cellules soit supprimées. Vous avez des idées?

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Citation Envoyé par JH&SG Voir le message
    Ma fonction fonctionne très bien s'il y a une ou deux cellules à supprimer mais s'il y en a plus, il faut que je m'y reprenne à plusieurs fois pour que toutes les cellules soit supprimées. Vous avez des idées?
    J'aurais tendance à te donner ma réponse habituelle à ce sujet...

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Tu as effectivement raison.
    Il est possible de modifier le GTK_LIST_STORE dans gtk_tree_model_foreach mais en fesant cela ça fait planté l'itérateur qui ne sais plus trop où il en est. Je pense que c'est ce que tu voulais dire.
    J'ai donc retravaillé mon programme pour qu'il fasse ce que je désire sans modifié le GTK_LIST_STORE directement dans gtk_tree_model_foreach.
    Merci pour votre aide.

  12. #12
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Par défaut
    Oui, peut-être que l'itérateur devient invalide après suppression ...
    A ce propos je me demande, si on modifie une valeur sur chaque iterateur du modèle, est-ce que cela peut le rendre invalide ?

    Car j'utilise un treeModelFilter, et j'ai au départ choisit de connecter une callback sur la méthode J'ai remarqué que gtk faisait plusieurs passage sur certains iterateur, et j'ai décidé d'utiliser plutot la méthode , puis d'utiliser la méthode dans laquelle je viendrais modifier la colonne de visibilité (en somme changer un booleen de l'iterateur...
    Seulement mon iterateur semble se perdre aussi...

  13. #13
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Un itérateur sur quel modèle ? sur celui du TreeModelFilter (ie qui contient juste les lignes visibles) ou sur celui sous-jacent (qui contient tous les éléments, le "child model" de la doc) ?

  14. #14
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Par défaut
    hmm cette question est intéressante
    je le fait sur le filtered... et maintenant que j'y pense (enfin que tu m'y fait penser), il faudrait plutot le faire sur le child model non ?

  15. #15
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Si tu changes la visibilité d'une ligne dans le modèle "filtré", tu vas changer son contenu puisqu'il ne contient que les lignes visibles. Donc ça peut expliquer pourquoi ton itérateur devient invalide. Je peux pas te dire s'il faut travailler sur l'autre modèle, ça dépend vraiment de ce que tu veux faire

  16. #16
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Par défaut
    Mon but est de faire une arborescence de fichiers, avec un filtre de visibilité (audio, etc..)
    En utilisant la fonction de visibilité du treeModelFilter, j'ai constaté que certains passages d'un type de fichier à un autre n'actualisait pas l'arbre, mais uniquement certaines séquences particulières (genre de audio à tous fichiers), et fonctionnait parfaitement dans tous les autre cas. Et en faisant de bêtes printf, j'ai constaté que gtk passait plusieurs fois dans la fonction de visibilité pour certaines row (comme par hasard celles qui n'étaient pas actulisées pour le filtre courant )

    Donc j'essaye de le faire plutot avec le foreach...
    Effectivment il me semble que tu avais raison, j'ai l'impression qu'il faut l'appliquer sur le model child

  17. #17
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Par défaut
    J'ai l'impression que parfois, lorsque je change la valeur de visibilité (j'ai vérifié je mets bien la bonne valeur), elle n'est pas prise en compte par la vue...
    --> en appelant deux fois la fonction de filtrage, c'est bon ...
    C'est peut-être pour cela que la fonction de visibilité passe plusieurs fois sur la même row, elle essaye d'optimiser ce fonctionnement ??
    Ou bien c'est un problème dans mon code, mais je ne vois pas bien où...

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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