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 GtkTable / unattach widget


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut Modification d'un GtkTable / unattach widget
    Salut à tous,

    Voici un nouveau problème assez interessant :

    Je voulais faire du dynamique dans mon interface graphique, une sorte de drag and drop, sauf que bon c'est avec des boutons pour le moment

    Toujours est il que pour ajouter/retirer des éléments, j'ai vite renoncé aux gtk_box, qui sont compliquées à modifier en cours de boucle run, et j'ai juste mis une gtk_table, dont je modifie la taille lorsque j'ajoutes un élément.

    Soit, ca marche trés bien pour l'ajout, par contre, pour enlever un élément, je coince

    en tentant 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
     
    // On supprime le filtre de la liste de filtres :
    		it = p->filtre;
    		do{
    			it = it->next;
    		}while(it->next);
     
    		f = it->data;
    		g_list_remove(p->filtre, f);
    		p->nbf --; // nombre de filtres
     
    		// On actualise l'IHM:
    		gtk_table_resize(GTK_TABLE(p->FiltresTable), p->nbf, 5);
    		gtk_widget_show_all(p->FiltresTable);
    il ne fait rien et en tentant ca :

    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
     
    // On supprime le filtre de la liste de filtres :
    		it = p->filtre;
    		do{
    			it = it->next;
    		}while(it->next);
     
    		f = it->data;
    		g_list_remove(p->filtre, f);
    		p->nbf --;
     
    		// On actualise l'IHM:
    		gtk_table_resize(GTK_TABLE(p->FiltresTable), p->nbf, 5);
    		it = p->filtre;
    		do{
    			f2 = (filtres*)it->data;
    			gtk_table_attach_defaults(GTK_TABLE(p->FiltresTable), GTK_WIDGET(f2->filtreBox), 0, 5, p->nbf -1, p->nbf);
    			it = it->next;
    		}while(it);
    		gtk_widget_show_all(p->FiltresTable);
    il me sort une erreur de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_table_attach : assertion 'child->parent == NULL' failed
    alors que ca n'est pas NULL (je teste un printf("%d\n", f->index); qui affiche le bon résultat)

    Voilou, en éspérant que vous quelqu'un y verra plus clair que moi

    Bonne journée !


    EDIT : à noter que le retrait de la GList fonctionne. C'est juste l'affichage qui plante.

  2. #2
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    pour le message d'erreur, gege à déjà répondu dans un autre topic :

    Là, à première vue, tu essais d'ajouter un widget qui est déjà dans une boite.
    => bah moi je veux bien, mais quand je veux juste actualiser certains éléments présents dans ma table (lors du resizing et de la réallocation d'autres éléments), je fais comment ?

    Enfin au final le problème semble venir de là, il me faut donc savoir comment desatacher un élément de ma table.

    J'ai tenté d'accéder à une fonction remove via le container, mais je trouve pas.

  3. #3
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Je need help la

    Svp

  4. #4
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Bon bah j'ai réussi

    en fait, ca se fait en deux étapes :

    Pour ceux que ca interesse, voici le code pour enlever un élément :
    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
     
    // On enleve tous les éléments de la table :
    		it = p->filtre;
    		do{
    			f2 = (filtres*)it->data;
    			gtk_container_remove(GTK_CONTAINER(p->FiltresTable), f2->filtreBox);
    			it = it->next;
    		}while(it);
     
    		// On supprime le filtre de la liste de filtres :
    		it = p->filtre;
    		do{
    			it = it->next;
    		}while(it->next);
     
    		f = it->data;
    		g_list_remove(p->filtre, f);
    		p->nbf --;
     
    		// On actualise l'IHM:
    		gtk_table_resize(GTK_TABLE(p->FiltresTable), p->nbf, 5);
    		it = p->filtre;
    		nb = 0;
    		do{
    			nb++;
    			f2 = (filtres*)it->data;
    			gtk_table_attach_defaults(GTK_TABLE(p->FiltresTable), f2->filtreBox, 0, 5, nb -1, nb);
    			it = it->next;
    		}while(it);
    		gtk_widget_show_all(p->HugeTable);
    	}
    Et donc la le problème, c'est que lors du container_remove, bah en fait le widget est détruit.

    => la solution est toute simple, mais il faut connaitre : ajouter une référence sur le widget lors de sa création !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    newf->filtreBox = gtk_hbox_new(TRUE, 0);
    	g_object_ref( G_OBJECT( newf->filtreBox ) );
    Voilou, pour trouver, il a fallu parcourir de nombreux forums gtk PHP, et en anglais, donc je pense que ce topic pourra au moins servir aux prochains

    Bonne fin de journée !

  5. #5
    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
    J'ajouterais la ref juste avant d'enlever l'élément, et je la retirerais juste après l'avoir réajouté. Parce que sinon, tes widgets ne seront jamais détruits.

  6. #6
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Oki thx

    enfin attention, dans mon cas, il faut faire attention :

    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
            do{
                f2 = (filtres*)it->data;
                g_object_ref( G_OBJECT( f2->filtreBox ) );
                gtk_container_remove(GTK_CONTAINER(p->FiltresTable), f2->filtreBox);
                it = it->next;
            }while(it);
    
            // On supprime le filtre de la liste de filtres :
            it = p->filtre;
            do{
                it = it->next;
            }while(it->next);
            
            f = it->data;
            g_list_remove(p->filtre, f);
            g_object_unref( G_OBJECT( f->filtreBox ) );

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

Discussions similaires

  1. Modification de couleur des widgets
    Par awalter1 dans le forum GTK+ avec Python
    Réponses: 2
    Dernier message: 05/10/2007, 17h24
  2. [VB6] modification de menu
    Par rikko23 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/11/2002, 21h30
  3. [] Datagrid vide après modification des propriétés
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/09/2002, 16h37
  4. Modification de l'évènement OnClick
    Par MrJéjé dans le forum C++Builder
    Réponses: 9
    Dernier message: 22/08/2002, 12h52
  5. Réponses: 11
    Dernier message: 23/07/2002, 14h33

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