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 :

Changer le nombre de décimale dans une GtkTreeViewColumn


Sujet :

GTK+ avec C & C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Amateur
    Inscrit en
    Août 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Août 2014
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Changer le nombre de décimale dans une GtkTreeViewColumn
    Bonjour,

    pour une petit projet personnel, je cherche depuis pas mal de temps de pouvoir changer le nombre de décimal affichée dans une GtkTreeVeiwColumn. J'utilise GtkCellRendererSpin et essaye de changer la propriété "digits" avec g_object_set. Le résultat n'est pas au rendez-vous. J'ai fais un petit exemple pour expliquer mon problème.

    voici le code

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    #include "constantes.h"
     
    int main (int argc, char *argv[])
    {
    	/* Déclaration des variables */
    	GtkWidget *fenetre = NULL;
    	GtkWidget *container_principal = NULL;
     
    	/* Initialisation de GTK+ */
    	gtk_init (&argc, &argv);
     
    	/* Création de la fenêtre principale */
    	fenetre = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title (GTK_WINDOW (fenetre), "Essai");
    	gtk_window_maximize (GTK_WINDOW (fenetre));
    	gtk_container_set_border_width (GTK_CONTAINER (fenetre), 0);
     
    	/* Création du container principal */
    	container_principal = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
    	gtk_container_add (GTK_CONTAINER (fenetre), container_principal);
     
    	/* Liste */
    		/* Déclaration des variables */
    		GtkListStore *liste = NULL;
    		GtkTreeIter element;
    		GtkWidget *liste_affichable = NULL;
    		GtkCellRenderer *rendu = NULL;
    		GtkCellRenderer *rendu_1 = NULL;
    		GtkCellRenderer *rendu_2 = NULL;
    		GtkTreeViewColumn *colonne = NULL;
     
    		liste = gtk_list_store_new(NB_COLONNE, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_BOOLEAN);
     
    		/* premier élémnet */
    		gtk_list_store_append (liste, &element);		
    		gtk_list_store_set (liste, &element, TEXTE, "essai 1", ENTIER, 0, FLOTTANT, 1.0525, BINAIRE, TRUE, -1);
     
    		/* deuxième élément */
    		gtk_list_store_append (liste, &element);
    		gtk_list_store_set (liste, &element, TEXTE, "essai 2", ENTIER, 1, FLOTTANT, 2.98765, BINAIRE, FALSE, -1);
     
    		/* liste affichable */
    		liste_affichable = gtk_tree_view_new_with_model (GTK_TREE_MODEL (liste));
     
    		/* première colonne */
    		rendu = gtk_cell_renderer_text_new ();
    		colonne = gtk_tree_view_column_new_with_attributes ("Texte", rendu, "text", TEXTE, NULL);
    		gtk_tree_view_append_column (GTK_TREE_VIEW (liste_affichable), colonne);
     
    		/* deuxième colonne */
    		rendu = gtk_cell_renderer_text_new ();
    		colonne = gtk_tree_view_column_new_with_attributes ("Entier", rendu, "text", ENTIER, NULL);
    		gtk_tree_view_append_column (GTK_TREE_VIEW (liste_affichable), colonne);
     
    		/* troisième élément */
    		rendu_1 = gtk_cell_renderer_spin_new ();
    		g_object_set (rendu_1, "digits", 2, NULL);
    		colonne = gtk_tree_view_column_new_with_attributes ("Flottant", rendu_1, "text", FLOTTANT, NULL);
    		gtk_tree_view_append_column (GTK_TREE_VIEW (liste_affichable), colonne);
     
    		/* quatrième élément */
    		rendu_2 = gtk_cell_renderer_toggle_new ();
    		colonne = gtk_tree_view_column_new_with_attributes ("Binaire", rendu_2, "active", BINAIRE, NULL);
    		gtk_tree_view_append_column (GTK_TREE_VIEW (liste_affichable), colonne);
     
    		gtk_box_pack_start (GTK_BOX (container_principal), liste_affichable, FALSE, FALSE, 20);
     
    	/* Boucle principale */
    	gtk_widget_show_all (fenetre);
    	gtk_main ();
     
    	return (EXIT_SUCCESS);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #ifndef CONSTANTES
    	#define CONSTANTES
     
    	enum nom_colonne
    	{
    		TEXTE,
    		ENTIER,
    		FLOTTANT,
    		BINAIRE,
    		NB_COLONNE
    	};
     
    #endif
    Résultat affiché :

    Nom : Capture d’écran de 2020-03-29 11-00-35.png
Affichages : 219
Taille : 14,6 Ko

    Merci pour vos réponses

  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
    Bonjour.

    Ce n'est pas si simple. Je me casse encore les dents pour mettre à jour le GtkCellRendererText . Mais voila tout de même un début d'explication.

    La propriété "digits" n'est valable que pour le GtkSpinButton qui est affiché lorsqu'on clique sur une cellule. Mais me diras tu, lorsque je clique rien ne se passe !

    Effectivement, malgré ce que laisse croire la documentation, il faut mettre un peu les mains dans le cambouis pour y parvenir.
    Tout d'abord il faut rendre le GtkCellRenderer "editable" puis luis adjoindre un GtkAdjustment dûment initialisé. Ce n'est que comme ca que le GtkSpinButton voudra bien s'afficher. Ce qui donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
      /* troisième élément */
      rendu_1 = gtk_cell_renderer_spin_new ();
      g_object_set (G_OBJECT (rendu_1), "editable", TRUE, NULL);
      GtkAdjustment *adjustment = gtk_adjustment_new (2.50, 0, 10., 0.01, 0.5, 2);
      g_object_set (G_OBJECT (rendu_1), "adjustment", adjustment, NULL);
    Maintenant que le GtkSpinButton s'affiche tu pourras remarquer que la valeur de "digits" prend tout son sens.

    L'étape suivante est de récupérer la valeur choisie par l'utilisateur. Il suffit pour cela de connecter un callback au signal "edited" du GtkCellRenderer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect (G_OBJECT (rendu_1), "edited", G_CALLBACK (renderer_edited_callback), NULL);
    Voila le callback associé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void renderer_edited_callback (GtkCellRendererText *renderer,
                   gchar               *path,
                   gchar               *new_text,
                   gpointer             user_data)
    {
      g_printerr ("path : %s\n", path);
      g_printerr ("text : %s\n", new_text);
     
      /* mise à jour du texte du cellrenderer */
      g_object_set (G_OBJECT (renderer), "text", new_text, NULL);
    }
    J'en suis là. Malheureusement la propriété "texte" est sans effet. La solution est proche...

  3. #3
    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
    Bonjour.

    Je reviens à la charge frais et dispo .

    J'ai la solution au problème.

    Tout d'abord, puisque tu veux maîtriser le format d'affichage des nombres il ne faut pas déclarer la colonne en G_TYPE_DOUBLE mais en G_TYPE_STRING. Sinon Gtk+ affiche les doubles avec toute la précision possible.

    A partir de là, il faut utiliser la fonction void gtk_list_store_set (GtkListStore *list_store, GtkTreeIter *iter, ...);. Comme tu peux le voir il nous avons besoin du pointeur GtkListStore* et il nous le faut dans le callback dont j'ai donné l'explication hier. Il nous faudra aussi accéder à l'iter de la cellule modifiée. Pour ce faire il nous faut aussi le GtkTreeModel* associé au GtkTreeView*. Ca commence à faire pas mal de monde.

    Pour résoudre ce petit problème sans passer par des déclarations globales on va déclarer une structure dans laquelle on retrouvera le GtkTreeView* et le GtkListStore* :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
      GtkWidget *liste_affichable;
      GtkListStore *liste;
    } treeview_t;
    Dans le main (); on déclare une variable du type de la structure et on initialise tout ce petit monde comme tu l'as fait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     /* Liste */
      /* Déclaration des variables */
      treeview_t treeview;
      ...
    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
     treeview.liste = gtk_list_store_new(NB_COLONNE, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_BOOLEAN);
       
      /* premier élément */
      gtk_list_store_append (treeview.liste, &element);
      gtk_list_store_set (treeview.liste, &element, TEXTE, "essai 1", ENTIER, 0, FLOTTANT, "0.25", BINAIRE, TRUE, -1);
     
      /* deuxième élément */
      gtk_list_store_append (treeview.liste, &element);
      gtk_list_store_set (treeview.liste, &element, TEXTE, "essai 2", ENTIER, 1, FLOTTANT, "2.98", BINAIRE, FALSE, -1);
     
      /* liste affichable */
      treeview.liste_affichable = gtk_tree_view_new_with_model (GTK_TREE_MODEL (treeview.liste));
     
      /* première colonne */
      rendu = gtk_cell_renderer_text_new ();
      colonne = gtk_tree_view_column_new_with_attributes ("Texte", rendu, "text", TEXTE, NULL);
      gtk_tree_view_append_column (GTK_TREE_VIEW (treeview.liste_affichable), colonne);
       ...
    Maintenant nous allons transmettre l'adresse de la variable "treeview" à notre callback :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     /* troisième élément */
      rendu_1 = gtk_cell_renderer_spin_new ();
      g_object_set (G_OBJECT (rendu_1), "editable", TRUE, NULL);
      GtkAdjustment *adjustment = gtk_adjustment_new (2.50, 0, 10., 0.01, 0.5, 2);
      g_object_set (G_OBJECT (rendu_1), "adjustment", adjustment, NULL);
      g_signal_connect (G_OBJECT (rendu_1), "edited", G_CALLBACK (renderer_edited_callback), &treeview);
    Il ne nous reste plus qu'à modifier notre callback.
    A l'intérieur de celui-ci je vais récupérer le pointeur de la variable "treeview" transmis. J'utilise la fonction gtk_tree_view_get_model (); pour récupérer le GtkTreeModel* associé. Avec j’utilise la fonction gtk_tree_model_get_iter_from_string (); pour récupérer le fameux iter de la cellule et enfin j'utilise gtk_list_store_set (); pour changer le contenu. Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void renderer_edited_callback (GtkCellRendererText *renderer, gchar *path, gchar *new_text, treeview_t *treeview)
    {
      /* mise à jour du texte du cellrenderer */
      GtkTreeModel *tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview->liste_affichable));
      GtkTreeIter iter;
      if (gtk_tree_model_get_iter_from_string (tree_model, &iter, path)) {
        gtk_list_store_set (treeview->liste, &iter, FLOTTANT, new_text, -1);
      }
    }

    Histoire d’avoir une vue d'ensemble voici le code exemple complet :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    enum nom_colonne
      {
       TEXTE,
       ENTIER,
       FLOTTANT,
       BINAIRE,
       NB_COLONNE
      };
     
    typedef struct {
      GtkWidget *liste_affichable;
      GtkListStore *liste;
    } treeview_t;
     
    void
    renderer_edited_callback (GtkCellRendererText *renderer, gchar *path, gchar *new_text, treeview_t *treeview)
    {
      g_printerr ("path : %s\n", path);
      g_printerr ("text : %s\n", new_text);
     
      /* mise à jour du texte du cellrenderer */
      GtkTreeModel *tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview->liste_affichable));
      GtkTreeIter iter;
      if (gtk_tree_model_get_iter_from_string (tree_model, &iter, path)) {
        gtk_list_store_set (treeview->liste, &iter, FLOTTANT, new_text, -1);
      }
    }
     
    int main (int argc, char *argv[])
    {
      /* Déclaration des variables */
      GtkWidget *fenetre = NULL;
      GtkWidget *container_principal = NULL;
     
      /* Initialisation de GTK+ */
      gtk_init (&argc, &argv);
     
      /* Création de la fenêtre principale */
      fenetre = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_window_set_title (GTK_WINDOW (fenetre), "Essai");
      gtk_container_set_border_width (GTK_CONTAINER (fenetre), 0);
     
      /* Création du container principal */
      container_principal = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
      gtk_container_add (GTK_CONTAINER (fenetre), container_principal);
      g_signal_connect (G_OBJECT (fenetre), "destroy", gtk_main_quit, NULL);
     
      /* Liste */
      /* Déclaration des variables */
      treeview_t treeview;
      GtkTreeIter element;
      GtkCellRenderer *rendu = NULL;
      GtkCellRenderer *rendu_1 = NULL;
      GtkCellRenderer *rendu_2 = NULL;
      GtkTreeViewColumn *colonne = NULL;
     
      treeview.liste = gtk_list_store_new(NB_COLONNE, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_BOOLEAN);
     
      /* premier élément */
      gtk_list_store_append (treeview.liste, &element);
      gtk_list_store_set (treeview.liste, &element, TEXTE, "essai 1", ENTIER, 0, FLOTTANT, "0.25", BINAIRE, TRUE, -1);
     
      /* deuxième élément */
      gtk_list_store_append (treeview.liste, &element);
      gtk_list_store_set (treeview.liste, &element, TEXTE, "essai 2", ENTIER, 1, FLOTTANT, "2.98", BINAIRE, FALSE, -1);
     
      /* liste affichable */
      treeview.liste_affichable = gtk_tree_view_new_with_model (GTK_TREE_MODEL (treeview.liste));
     
      /* première colonne */
      rendu = gtk_cell_renderer_text_new ();
      colonne = gtk_tree_view_column_new_with_attributes ("Texte", rendu, "text", TEXTE, NULL);
      gtk_tree_view_append_column (GTK_TREE_VIEW (treeview.liste_affichable), colonne);
     
      /* deuxième colonne */
      rendu = gtk_cell_renderer_text_new ();
      colonne = gtk_tree_view_column_new_with_attributes ("Entier", rendu, "text", ENTIER, NULL);
      gtk_tree_view_append_column (GTK_TREE_VIEW (treeview.liste_affichable), colonne);
     
      /* troisième élément */
      rendu_1 = gtk_cell_renderer_spin_new ();
      g_object_set (G_OBJECT (rendu_1), "editable", TRUE, NULL);
      GtkAdjustment *adjustment = gtk_adjustment_new (2.50, 0, 10., 0.01, 0.5, 2);
      g_object_set (G_OBJECT (rendu_1), "adjustment", adjustment, NULL);
      g_signal_connect (G_OBJECT (rendu_1), "edited", G_CALLBACK (renderer_edited_callback), &treeview);
     
     
      colonne = gtk_tree_view_column_new_with_attributes ("Flottant", rendu_1, "text", FLOTTANT, NULL);
      gtk_tree_view_append_column (GTK_TREE_VIEW (treeview.liste_affichable), colonne);
      g_object_set (G_OBJECT (rendu_1), "digits", 2, NULL);
     
      /* quatrième élément */
      rendu_2 = gtk_cell_renderer_toggle_new ();
      colonne = gtk_tree_view_column_new_with_attributes ("Binaire", rendu_2, "active", BINAIRE, NULL);
      gtk_tree_view_append_column (GTK_TREE_VIEW (treeview.liste_affichable), colonne);
     
      gtk_box_pack_start (GTK_BOX (container_principal), treeview.liste_affichable, FALSE, FALSE, 20);
     
      /* Boucle principale */
      gtk_widget_show_all (fenetre);
      gtk_main ();
     
      return (EXIT_SUCCESS);
    }

  4. #4
    Candidat au Club
    Homme Profil pro
    Amateur
    Inscrit en
    Août 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Août 2014
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Parfait, je viens de tester, c'est exactement ce que je voulais. Merci gerald3d pour tes réponses et le temps passé.

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

Discussions similaires

  1. Changer le nombre de choix dans une comboBox
    Par jlau89 dans le forum Flex
    Réponses: 5
    Dernier message: 14/06/2011, 10h00
  2. Réponses: 1
    Dernier message: 29/12/2010, 15h10
  3. [débutant] définition du nombre de décimales dans une requête
    Par a2line dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 02/12/2006, 21h57
  4. insérer un nombre décimale dans une table
    Par mouloudéen dans le forum Access
    Réponses: 4
    Dernier message: 02/10/2005, 21h29
  5. recherche du nombre d'occurences dans une table
    Par berry dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/01/2004, 20h03

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