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 :

comment recuperer le signal emis par une checkbox dans une Listview


Sujet :

GTK+ avec C & C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 7
    Points
    7
    Par défaut comment recuperer le signal emis par une checkbox dans une Listview
    salut ! j'utilise gtk+ depuis pas longtemps et la le bloque !
    je voudrai savoir comment rendre une checkbox clickable dans une listview , et aussi comment recuperer le signal associé dans le but de suprimer la ou les lignes selectionnées !


    voila un code exemple :

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    #include <stdlib.h>
    #include <stdio.h>
    #include <gtk/gtk.h>
     
    enum {
        TEXT_COLUMN,
        TOGGLE_COLUMN,
        N_COLUMN
    };
     
    int main(int argc, char **argv)
    {
        GtkWidget *pWindow;
        GtkWidget *pListView;
        GtkWidget *pScrollbar;
        GtkListStore *pListStore;
        GtkTreeViewColumn *pColumn;
        GtkCellRenderer *pCellRenderer;
        gchar *sTexte;
        gint i;
     
        gtk_init(&argc, &argv);
     
        /* Creation de la fenetre principale */
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
        gtk_window_set_title(GTK_WINDOW(pWindow), "GtkTreeView et GtkListStore");
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
        /* Creation du modele */
        pListStore = gtk_list_store_new(N_COLUMN, G_TYPE_STRING, G_TYPE_BOOLEAN);
     
        sTexte = g_malloc(12);
     
        /* Insertion des elements */
        for(i = 0 ; i < 10 ; ++i)
        {
            GtkTreeIter pIter;
     
            sprintf(sTexte, "Ligne %d\0", i);
     
            /* Creation de la nouvelle ligne */
            gtk_list_store_append(pListStore, &pIter);
     
            /* Mise a jour des donnees */
            gtk_list_store_set(pListStore, &pIter,
                TEXT_COLUMN, sTexte,
                TOGGLE_COLUMN, TRUE,
                -1);
        }
     
        g_free(sTexte);
     
        /* Creation de la vue */
        pListView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(pListStore));
     
        /* Creation de la premiere colonne */
        pCellRenderer = gtk_cell_renderer_text_new();
        pColumn = gtk_tree_view_column_new_with_attributes("Titre",
            pCellRenderer,
            "text", TEXT_COLUMN,
            NULL);
     
        /* Ajout de la colonne à la vue */
        gtk_tree_view_append_column(GTK_TREE_VIEW(pListView), pColumn);
     
        /* Creation de la deuxieme colonne */
        pCellRenderer = gtk_cell_renderer_toggle_new();
        pColumn = gtk_tree_view_column_new_with_attributes("CheckBox",
            pCellRenderer,
            "active", TOGGLE_COLUMN,
            NULL);
     
        /* Ajout de la colonne à la vue */
        gtk_tree_view_append_column(GTK_TREE_VIEW(pListView), pColumn);
     
        /* Ajout de la vue a la fenetre */
        pScrollbar = gtk_scrolled_window_new(NULL, NULL);
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pScrollbar),
            GTK_POLICY_AUTOMATIC,
            GTK_POLICY_AUTOMATIC);
        gtk_container_add(GTK_CONTAINER(pScrollbar), pListView);
        gtk_container_add(GTK_CONTAINER(pWindow), pScrollbar);
     
        gtk_widget_show_all(pWindow);
     
        gtk_main();
     
        return EXIT_SUCCESS;
    }
    un coup de pouce serait tres aimable de votre part ! merci

    pourai je savoir juste pourquoi la checkbox ne reagi pas au click ! pourtant je met la propriete "activatable" a true !!

    g_object_set(G_OBJECT(pCellRenderer), "activatable",TRUE,NULL);

    est ce que ca peut venir de ma version gtk+ 2.10 qui n'est pas a jour ?

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Salut.

    Je me suis collé à ton problème.

    J'ai une solution qui n'apporte qu'une réponse partielle. Il faut connecter un CALLBACK aux cellrenderer avec le signal "toggled". Dans ce callback tu testes l'état du bouton. J'ai modifié ton code en fonction est ca fonctionne.
    Maintenant le problème vient du fait que les 10 boutons ne sont en fait qu'un seul. Donc lorsque tu changes l'état de l'un, ca change l'état de tous! Je pense qu'il faudrait créer autant de boutons que de lignes de manière individuelle pour éviter ce désagrément.
    Je te fourni le code modifié :
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    #include <stdlib.h>
    #include <stdio.h>
    #include <gtk/gtk.h>
     
    enum {
        TEXT_COLUMN,
        TOGGLE_COLUMN,
        N_COLUMN
    };
     
    void toggled_func(GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data)
    {
    	if (gtk_cell_renderer_toggle_get_active (cell_renderer))
    	{
    		printf("CellRendererToggle is actually active. This state gonna change.\n");
    		gtk_cell_renderer_toggle_set_active (cell_renderer, FALSE);
    	}
    	else
    	{
    		printf("CellRendererToggle is actually inactive. This state gonna change.\n");
    		gtk_cell_renderer_toggle_set_active (cell_renderer, TRUE);
    	}
    }
     
    int main(int argc, char **argv)
    {
        GtkWidget *pWindow;
        GtkWidget *pListView;
        GtkWidget *pScrollbar;
        GtkListStore *pListStore;
        GtkTreeViewColumn *pColumn;
        GtkCellRenderer *pCellRenderer;
        gchar *sTexte;
        gint i;
     
        gtk_init(&argc, &argv);
     
        /* Creation de la fenetre principale */
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
        gtk_window_set_title(GTK_WINDOW(pWindow), "GtkTreeView et GtkListStore");
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
        /* Creation du modele */
        pListStore = gtk_list_store_new(N_COLUMN, G_TYPE_STRING, G_TYPE_BOOLEAN);
     
        sTexte = g_malloc(12);
     
        /* Insertion des elements */
        for(i = 0 ; i < 10 ; ++i)
        {
            GtkTreeIter pIter;
     
            sprintf(sTexte, "Ligne %d\0", i);
     
            /* Creation de la nouvelle ligne */
            gtk_list_store_append(pListStore, &pIter);
     
            /* Mise a jour des donnees */
            gtk_list_store_set(pListStore, &pIter,
                TEXT_COLUMN, sTexte,
                TOGGLE_COLUMN, TRUE,
                -1);
        }
     
        g_free(sTexte);
     
        /* Creation de la vue */
        pListView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(pListStore));
     
        /* Creation de la premiere colonne */
        pCellRenderer = gtk_cell_renderer_text_new();
        pColumn = gtk_tree_view_column_new_with_attributes("Titre",
            pCellRenderer,
            "text", TEXT_COLUMN,
            NULL);
     
        /* Ajout de la colonne à la vue */
        gtk_tree_view_append_column(GTK_TREE_VIEW(pListView), pColumn);
     
        /* Creation de la deuxieme colonne */
        pCellRenderer = gtk_cell_renderer_toggle_new();
    		g_signal_connect(G_OBJECT(pCellRenderer), "toggled", (GCallback)toggled_func, NULL);
     
        pColumn = gtk_tree_view_column_new_with_attributes("CheckBox",
            pCellRenderer, NULL);
     
        /* Ajout de la colonne à la vue */
        gtk_tree_view_append_column(GTK_TREE_VIEW(pListView), pColumn);
     
        /* Ajout de la vue a la fenetre */
        pScrollbar = gtk_scrolled_window_new(NULL, NULL);
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pScrollbar),
            GTK_POLICY_AUTOMATIC,
            GTK_POLICY_AUTOMATIC);
        gtk_container_add(GTK_CONTAINER(pScrollbar), pListView);
        gtk_container_add(GTK_CONTAINER(pWindow), pScrollbar);
     
        gtk_widget_show_all(pWindow);
     
        gtk_main();
     
        return EXIT_SUCCESS;
    }

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    merci gerald3d maintenant c'est déja pas mal meme si ca a un comportement bizar qui vient effectivement du fait que les 10 boutons sont considérés comme un seul bouton . je vais voir comment résoudre ce probleme c'est a dire sans devoir créer chaque bouton individuellement car dans le cas ou j'ignore le nombre de lignes ca risque de poser probleme . en tout cas merci encore pour le coup de mains

  4. #4
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Points : 7
    Points
    7
    Par défaut enfin
    euhh gerald3d apres avoir bien analysé ta solution jai constaté que tu agissais sur le rendu de la colonne qui contient les checkboxs et non sur la checkbox consernée ce qui explique pourquoi le changement les affectait toutes. ce qui m'a permis de remédier a ca plus facilement !
    voila la solution a ce probleme au cas ou quelqu'un en aurait besoin un jour .

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <gtk/gtk.h>
     
     
    enum {
        TEXT_COLUMN,
        TOGGLE_COLUMN,
        N_COLUMN
    };
     
    void toggled_func(GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data)
    {
     
        GtkTreeIter iter;
        GtkTreePath *ppath;
        gboolean boolean;
     
     
    // convertir la chaine path en GtkTreePath 
     
         ppath = gtk_tree_path_new_from_string (path);
     
    // convertir la valeure recuperée en GtkTreeIter  
         gtk_tree_model_get_iter (GTK_TREE_MODEL (user_data),
                               &iter,
                               ppath);
    //  utiliser la variable GtkTreeIter pour acceder la valeure booleaine                           
         gtk_tree_model_get (GTK_TREE_MODEL (user_data),
                               &iter,
                               TOGGLE_COLUMN,&boolean,
                               -1);
    // changer cette valeure booleaine (! boolean )                          
         gtk_list_store_set (user_data, &iter,
                          TOGGLE_COLUMN, !boolean,
                          -1);
     
     
    }
     
    int main(int argc, char **argv)
    {
        GtkWidget *pWindow;
        GtkWidget *pListView;
        GtkWidget *pScrollbar;
        GtkListStore *pListStore;
        GtkTreeViewColumn *pColumn;
        GtkCellRenderer *pCellRenderer;
        gchar *sTexte;
        gint i;
     
        gtk_init(&argc, &argv);
     
        /* Creation de la fenetre principale */
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
        gtk_window_set_title(GTK_WINDOW(pWindow), "GtkTreeView et GtkListStore");
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
        /* Creation du modele */
        pListStore = gtk_list_store_new(N_COLUMN, G_TYPE_STRING, G_TYPE_BOOLEAN);
     
        sTexte = g_malloc(12);
     
        /* Insertion des elements */
        for(i = 0 ; i < 10 ; ++i)
        {
            GtkTreeIter pIter;
     
            sprintf(sTexte, "Ligne %d\0", i);
     
            /* Creation de la nouvelle ligne */
            gtk_list_store_append(pListStore, &pIter);
     
            /* Mise a jour des donnees */
            gtk_list_store_set(pListStore, &pIter,
                TEXT_COLUMN, sTexte,
                 TOGGLE_COLUMN,FALSE,
                -1);
        }
     
        g_free(sTexte);
     
        /* Creation de la vue */
        pListView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(pListStore));
     
        /* Creation de la premiere colonne */
        pCellRenderer = gtk_cell_renderer_text_new();
        pColumn = gtk_tree_view_column_new_with_attributes("Titre",
            pCellRenderer,
            "text", TEXT_COLUMN,
            NULL);
     
        /* Ajout de la colonne à la vue */
        gtk_tree_view_append_column(GTK_TREE_VIEW(pListView), pColumn);
     
        /* Creation de la deuxieme colonne */
        pCellRenderer = gtk_cell_renderer_toggle_new();
     
     
        pColumn = gtk_tree_view_column_new_with_attributes("CheckBox",
            pCellRenderer,
            "active", TOGGLE_COLUMN,
     
             NULL);
     
        /* Ajout de la colonne à la vue */
        gtk_tree_view_append_column(GTK_TREE_VIEW(pListView), pColumn);
     
        /* Ajout de la vue a la fenetre */
        pScrollbar = gtk_scrolled_window_new(NULL, NULL);
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pScrollbar),
            GTK_POLICY_AUTOMATIC,
            GTK_POLICY_AUTOMATIC);
        gtk_container_add(GTK_CONTAINER(pScrollbar), pListView);
        gtk_container_add(GTK_CONTAINER(pWindow), pScrollbar);
     
        gtk_widget_show_all(pWindow);
        g_signal_connect(G_OBJECT(pCellRenderer), "toggled", (GCallback)toggled_func, pListStore);
        gtk_main();
     
        return EXIT_SUCCESS;
    }

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/03/2011, 18h29
  2. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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