Pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter, inscrivez-vous gratuitement !

 

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2009
    Messages : 9
    Points : 18
    Points
    18

    Par défaut GtkTreeView avec GtkScrolledWindow

    Bonjour à tous.

    J'ai parcouru les tutos de ce site et d'autres aussi.
    J'ai cherché dans les messages de cette section du forum,
    mais sans doute mal puisque je n'ai pas vraiment trouvé, une solution à ce problème :

    Au moyen de clics sur boutons, on ajoute des éléments dans un treeView simple
    avec barres de défilement.

    Pour que le dernier élément ajouté soit visible, j'ai dû bidouiller :
    ajouter en sus un élément bidon avant de demander l'ajustement du scrolling
    et bien entendu je l'ôte avant d'ajouter le prochain élément.

    Quelqu'un aurait-il une solution moins tordue ?

    P.S. − En C, je suis un bricolo, et en GTK je débute.
    Je compile avec gcc sous NUX par ce moyen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nomfic="41_voir_dernier_ajout_dans_treeView"
    gcc ${nomfic}.c -o ${nomfic} `pkg-config --cflags --libs gtk+-2.0`
    GTK2 plutôt que GTK3 : parce que je débute et que les tutos de ce site sont en GTK2.

    Ci-dessous, mon code 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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
     
    #include <stdlib.h>
    #include <string.h>
    #include <gtk/gtk.h>
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    GtkWidget *gpTreeView, *gpScrollbar, *gpLabel;
    GtkListStore *gpListStore;
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void creInterface();
    void listeAjouter (char *str);
    void boutonClic(GtkWidget *bouton, gpointer data);
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // listeAjouter : ajouter sText à gpListStore (déclaré en global)
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void listeAjouter (char *sText) {
    GtkAdjustment* vAjust;
    char buf[80];
    gdouble lAjust;
    static int nbLignes = 0;
    static GtkTreeIter iter;
     
    	nbLignes++;
    	sprintf(buf, "ligne %2d : %s", nbLignes, sText);
    	printf("*** listeAjouter %s ***\n", buf);
     
    	// !!!! Supprimer d'abord la ligne bidon 
    	//      servant à l'ajustement de l'ascenseur vertical
    	if (nbLignes > 1) gtk_list_store_remove(gpListStore, &iter);
     
    	// Creation et ajout nouvelle ligne au treeView
    	gtk_list_store_append(gpListStore, &iter);
    	gtk_list_store_set(gpListStore, &iter, 0, buf, -1);
     
    	// !!!! Je triche en ajoutant une ligne bidon à la fin
    	//      sinon la dernière ligne réelle contenant buf n'est pas visible
    	gtk_list_store_append(gpListStore, &iter);	
    	gtk_list_store_set(gpListStore, &iter, 0, "...", -1);
     
    	// Ajustement de l'ascenseur vertical
    	vAjust = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(gpScrollbar));
    	lAjust = gtk_adjustment_get_upper(vAjust);
     
    	gtk_adjustment_set_value(vAjust, lAjust);
     
    	printf("    lAjust = %ld\n", lAjust);
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void boutonClic(GtkWidget *bouton, gpointer data) {
    char buf[80], msg[160];
    gchar* sUtf8;
     
    	strcpy( buf, gtk_button_get_label (GTK_BUTTON(bouton)) );
    	if (strstr(buf, "Quitter")) {
    		printf("\n    ####  SORTIE DEMANDEE  ####\n");
    		gtk_main_quit();
    	}
    	else {
    		sprintf(msg, "<span face=\"Courier New\">Dernier bouton cliqué : '%s'</span>", buf);
    		sUtf8 = g_locale_to_utf8(msg, -1, NULL, NULL, NULL);
    		gtk_label_set_markup(GTK_LABEL(gpLabel), sUtf8);
    		g_free(sUtf8);
     
    		sprintf(msg, "Label du bouton cliqué : '%s' ", buf);
    		listeAjouter(msg);
    	}
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void creInterface() {
    GtkWidget *p_win1, *p_main_vbox, *pBoxH;
    GtkWidget *bouton, *defil;
    GtkTreeViewColumn *pColumn;
    GtkCellRenderer *pCellRenderer;
    int n;
    char buf[80];
    static char *labels[] = { "Voir", "Entendre", "Sentir", "Toucher", 
    		"Regarder", "Ecouter", "Humer", "Quitter" };
     
    	// Fenetre 1/1
    	p_win1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title(GTK_WINDOW(p_win1), "41_voir_dernier_ajout_dans_treeView");
    	gtk_window_set_default_size(GTK_WINDOW(p_win1), 580, 180);
    	gtk_container_border_width (GTK_CONTAINER (p_win1), 10);
    	g_signal_connect(G_OBJECT(p_win1), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    	/******************************************************************************/
    	// Boite verticale 1/1 dans fenetre 1
    	p_main_vbox = gtk_vbox_new(FALSE, 0);
    	gtk_container_add(GTK_CONTAINER(p_win1), p_main_vbox);
     
    	// boite horizontale 1/2 dans boite verticale
    	pBoxH = gtk_hbox_new(FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(p_main_vbox), pBoxH, FALSE, FALSE, 0);
     
    	// Boutons dans boite horizontale 1
    	for (n=1; n<5; n++) {
    		sprintf(buf, " %d. %s ", n, labels[n-1]);
    		bouton = gtk_button_new_with_label(buf);
    		gtk_box_pack_start(GTK_BOX(pBoxH), bouton, TRUE, FALSE, 0);
    		g_signal_connect(G_OBJECT(bouton), "clicked", G_CALLBACK(boutonClic), NULL);
    	}
    	/******************************************************************************/
    	// Création treeView avec barres de défilement
    	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    	// modele du treeView : 1 colonne de type chaine
    	gpListStore = gtk_list_store_new(1, G_TYPE_STRING);
    	gpTreeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(gpListStore));
     
    	// Creation colonne 1/1
    	pCellRenderer = gtk_cell_renderer_text_new();
    	pColumn = gtk_tree_view_column_new_with_attributes("Je ne veux pas de titre !",
    		pCellRenderer, "text", 0, NULL);
    	gtk_tree_view_append_column(GTK_TREE_VIEW(gpTreeView), pColumn);
     
    	// Ajout barres de défilement 
    	gpScrollbar = gtk_scrolled_window_new(NULL, NULL);
    	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gpScrollbar),
    			GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
     
    	// Associer treeView aux barres de défilement
    	gtk_container_add(GTK_CONTAINER(gpScrollbar), gpTreeView);
     
    	// Associer barres de défilement à la boite verticale
    	gtk_container_add(GTK_CONTAINER(p_main_vbox), gpScrollbar);
     
    	// pêché ici : https://gtk.developpez.com/cours/listes-arbres/#LIV-A-2-a
    	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gpTreeView), FALSE);
     
    	/******************************************************************************/
    	// Boite horizontale 2/2 dans boite verticale
    	pBoxH = gtk_hbox_new(FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(p_main_vbox), pBoxH, FALSE, FALSE, 0);
     
    	// Boutons dans boite horizontale 2
    	for (n=5; n<9; n++) {
    		sprintf(buf, " %d. %s ", n, labels[n-1]);
    		bouton = gtk_button_new_with_label(buf);
    		gtk_box_pack_start(GTK_BOX(pBoxH), bouton, TRUE, FALSE, 0);
    		g_signal_connect(G_OBJECT(bouton), "clicked", G_CALLBACK(boutonClic), NULL);
    	}
    	/******************************************************************************/
    	// Label pour tracer info dernier bouton cliqué
    	gpLabel=gtk_label_new("\nCe label soit etre justifie a droite");
    	gtk_label_set_justify(GTK_LABEL(gpLabel), GTK_JUSTIFY_RIGHT);
    	gtk_container_add(GTK_CONTAINER(p_main_vbox), gpLabel);
    	/******************************************************************************/
    	gtk_widget_show_all(p_win1);
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    int main (int argc, char *argv[]) {
    	gtk_init (&argc, &argv);
    	creInterface();
    	gtk_main ();
    return (0);
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2009
    Messages
    1 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2009
    Messages : 1 351
    Points : 1 996
    Points
    1 996

    Par défaut

    Citation Envoyé par Alain de La Chaume Voir le message
    GTK2 plutôt que GTK3 : parce que je débute et que les tutos de ce site sont en GTK2.
    Snif. Entendre ce genre de choses me désole. Je veux vraiment les mettre à la retraite ces tutoriels, mais je n'ai pas encore le pouvoir de le faire...
    Pour le reste, je passe malheureusement mon tour, je n'ai pas eu l'occasion de faire joujou avec ces widgets.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2009
    Messages : 9
    Points : 18
    Points
    18

    Par défaut


    Citation Envoyé par liberforce Voir le message
    Snif. Entendre ce genre de choses me désole.
    Non... faut pas, ils ont le mérite d'exister et d'être utiles.
    Quand j'aurai globalement compris ce qui est dit dans ces tutos-là,
    je devrais pouvoir me mettre au GTK3 sans trop de difficultés, enfin, je crois...

    Comme je ne suis pas un pro, la description des widgets, de leurs fonctions et propriétés
    que l'on trouve sans problème ne me suffit pas toujours.
    J'ai aussi trouvé pas mal d'exemples, mais pas un sur ce cas précisément.

    Donc si une âme charitable pouvait jeter un œil sur mon code et de donner un conseil...

  4. #4
    Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    septembre 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : septembre 2017
    Messages : 43
    Points : 64
    Points
    64

    Par défaut

    Bonjour,

    Je ne suis pas sûr d'avoir compris, mais peut-être que gtk-scrolled-window-set-placement répondrais à ta question?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2009
    Messages : 9
    Points : 18
    Points
    18

    Par défaut

    Bonjour ,
    Citation Envoyé par aeiou
    Je ne suis pas sûr d'avoir compris
    On ajoute des éléments dans un treeView simple avec barres de défilement
    et je voudrais que le dernier élément ajouté soit visible automatiquement.
    Le code complet mais court est inclus dans mon premier message.

    Citation Envoyé par aeiou
    peut-être que gtk-scrolled-window-set-placement répondrais à ta question
    J'ai testé en modifiant ainsi la fonction listeAjouter
    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
    void listeAjouter (char *sText) {
    GtkAdjustment* vAjust;
    char buf[80];
    gdouble lAjust;
    static int nbLignes = 0;
    static GtkTreeIter iter;
     
    	nbLignes++;
    	sprintf(buf, "ligne %2d : %s", nbLignes, sText);
    	printf("*** listeAjouter %s ***\n", buf);
     
    	// !!!! Supprimer d'abord la ligne bidon 
    	//      servant à l'ajustement de l'ascenseur vertical
    //	if (nbLignes > 1) gtk_list_store_remove(gpListStore, &iter);
     
    	// Creation et ajout nouvelle ligne au treeView
    	gtk_list_store_append(gpListStore, &iter);
    	gtk_list_store_set(gpListStore, &iter, 0, buf, -1);
     
    	gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW(gpScrollbar),
                                       GTK_CORNER_BOTTOM_RIGHT);
     
    /*	// !!!! Je triche en ajoutant une ligne bidon à la fin
    	//      sinon la dernière ligne réelle contenant buf n'est pas visible
    	gtk_list_store_append(gpListStore, &iter);	
    	gtk_list_store_set(gpListStore, &iter, 0, "...", -1);
     
    	// Ajustement de l'ascenseur vertical
    	vAjust = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(gpScrollbar));
    	lAjust = gtk_adjustment_get_upper(vAjust);
     
    	gtk_adjustment_set_value(vAjust, lAjust);
     
    	printf("    lAjust = %ld\n", lAjust);
    	*/
    }
    mais cela ne fait que modifier la position de la fenêtre par rapport à la barre de défilement vertical (à droite ou à gauche). Pas glop !

  6. #6
    Membre du Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    septembre 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Bâtiment

    Informations forums :
    Inscription : septembre 2017
    Messages : 43
    Points : 64
    Points
    64

    Par défaut Nouvelle change, même joueur

    Peut-être gtk_tree_view_scroll_to_cell


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        // Ajustement de l'ascenseur vertical
    #if 1
        vAjust = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(gpScrollbar));
        lAjust = gtk_adjustment_get_upper(vAjust);
     
        gtk_adjustment_set_value(vAjust, lAjust);
        printf("    lAjust = %ld\n", lAjust);
    #else
        GtkTreePath *path = gtk_tree_model_get_path (GTK_TREE_MODEL (gpListStore), &iter);
        gtk_tree_view_scroll_to_cell(gpTreeView, path, NULL, FALSE, 0, 0);
    #endif

  7. #7
    Membre expert
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    février 2008
    Messages
    1 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : février 2008
    Messages : 1 965
    Points : 3 714
    Points
    3 714
    Billets dans le blog
    4

    Par défaut

    Bonjour.

    Pour faire court, tu n'étais pas loin de réussir. Il doit y avoir un petit problème de priorité dans le traitement des affichages. Pour être sûr que tout ce petit monde fonctionne correctement il faut passer par l'appel des signaux.

    Je m’explique. Tu récupères le GtkAdjustment* du GtkScrolledWindow* pour le modifier une fois le contenu du GtkTreeView* mis à jour. C'est là ton erreur.

    Il te faut connecter un callback au signal "changed" du GtkAdjustment* dans lequel tu changeras la position du GtkScrolledWindow*.

    Tu trouveras ci-dessous ton programme modifié en fonction des remarques précédentes. Toutes les modifications sont en rouge.

    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
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
     
    #include <stdlib.h>
    #include <string.h>
    #include <gtk/gtk.h>
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    GtkWidget *gpTreeView, *gpScrollbar, *gpLabel;
    GtkListStore *gpListStore;
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void creInterface();
    void listeAjouter (char *str);
    void boutonClic(GtkWidget *bouton, gpointer data);
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    void
    callback_vadj_changed (GtkAdjustment *Vadjust, gpointer userdata)
    {
      gtk_adjustment_set_value(Vadjust, gtk_adjustment_get_upper(Vadjust));
    }
    
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // listeAjouter : ajouter sText à gpListStore (déclaré en global)
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void listeAjouter (char *sText) {
    GtkAdjustment* vAjust;
    char buf[80];
    gdouble lAjust;
    static int nbLignes = 0;
    static GtkTreeIter iter;
     
    	nbLignes++;
    	sprintf(buf, "ligne %2d : %s", nbLignes, sText);
    	printf("*** listeAjouter %s ***\n", buf);
     
    	// !!!! Supprimer d'abord la ligne bidon 
    	//      servant à l'ajustement de l'ascenseur vertical
    	if (nbLignes > 1) gtk_list_store_remove(gpListStore, &iter);
     
    	// Creation et ajout nouvelle ligne au treeView
    	gtk_list_store_append(gpListStore, &iter);
    	gtk_list_store_set(gpListStore, &iter, 0, buf, -1);
     
    	// !!!! Je triche en ajoutant une ligne bidon à la fin
    	//      sinon la dernière ligne réelle contenant buf n'est pas visible
    	gtk_list_store_append(gpListStore, &iter);	
    	gtk_list_store_set(gpListStore, &iter, 0, "...", -1);
     
    	// Ajustement de l'ascenseur vertical
    	/* vAjust = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(gpScrollbar)); */
    	/* lAjust = gtk_adjustment_get_upper(vAjust); */
     
    	/* gtk_adjustment_set_value(vAjust, lAjust); */
     
    	/* printf("    lAjust = %ld\n", lAjust); */
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void boutonClic(GtkWidget *bouton, gpointer data) {
    char buf[80], msg[160];
    gchar* sUtf8;
     
    	strcpy( buf, gtk_button_get_label (GTK_BUTTON(bouton)) );
    	if (strstr(buf, "Quitter")) {
    		printf("\n    ####  SORTIE DEMANDEE  ####\n");
    		gtk_main_quit();
    	}
    	else {
    		sprintf(msg, "<span face=\"Courier New\">Dernier bouton cliqué : '%s'</span>", buf);
    		sUtf8 = g_locale_to_utf8(msg, -1, NULL, NULL, NULL);
    		gtk_label_set_markup(GTK_LABEL(gpLabel), sUtf8);
    		g_free(sUtf8);
     
    		sprintf(msg, "Label du bouton cliqué : '%s' ", buf);
    		listeAjouter(msg);
    	}
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void creInterface() {
    GtkWidget *p_win1, *p_main_vbox, *pBoxH;
    GtkWidget *bouton, *defil;
    GtkTreeViewColumn *pColumn;
    GtkCellRenderer *pCellRenderer;
    int n;
    char buf[80];
    static char *labels[] = { "Voir", "Entendre", "Sentir", "Toucher", 
    		"Regarder", "Ecouter", "Humer", "Quitter" };
     
    	// Fenetre 1/1
    	p_win1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title(GTK_WINDOW(p_win1), "41_voir_dernier_ajout_dans_treeView");
    	gtk_window_set_default_size(GTK_WINDOW(p_win1), 580, 180);
    	gtk_container_border_width (GTK_CONTAINER (p_win1), 10);
    	g_signal_connect(G_OBJECT(p_win1), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    	/******************************************************************************/
    	// Boite verticale 1/1 dans fenetre 1
    	p_main_vbox = gtk_vbox_new(FALSE, 0);
    	gtk_container_add(GTK_CONTAINER(p_win1), p_main_vbox);
     
    	// boite horizontale 1/2 dans boite verticale
    	pBoxH = gtk_hbox_new(FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(p_main_vbox), pBoxH, FALSE, FALSE, 0);
     
    	// Boutons dans boite horizontale 1
    	for (n=1; n<5; n++) {
    		sprintf(buf, " %d. %s ", n, labels[n-1]);
    		bouton = gtk_button_new_with_label(buf);
    		gtk_box_pack_start(GTK_BOX(pBoxH), bouton, TRUE, FALSE, 0);
    		g_signal_connect(G_OBJECT(bouton), "clicked", G_CALLBACK(boutonClic), NULL);
    	}
    	/******************************************************************************/
    	// Création treeView avec barres de défilement
    	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    	// modele du treeView : 1 colonne de type chaine
    	gpListStore = gtk_list_store_new(1, G_TYPE_STRING);
    	gpTreeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(gpListStore));
     
    	// Creation colonne 1/1
    	pCellRenderer = gtk_cell_renderer_text_new();
    	pColumn = gtk_tree_view_column_new_with_attributes("Je ne veux pas de titre !",
    		pCellRenderer, "text", 0, NULL);
    	gtk_tree_view_append_column(GTK_TREE_VIEW(gpTreeView), pColumn);
     
    	// Ajout barres de défilement 
    	gpScrollbar = gtk_scrolled_window_new(NULL, NULL);
    	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gpScrollbar),
    			GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
    	g_signal_connect (G_OBJECT (gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(gpScrollbar))), "changed", G_CALLBACK (callback_vadj_changed), NULL);
    
     
    	// Associer treeView aux barres de défilement
    	gtk_container_add(GTK_CONTAINER(gpScrollbar), gpTreeView);
     
    	// Associer barres de défilement à la boite verticale
    	gtk_container_add(GTK_CONTAINER(p_main_vbox), gpScrollbar);
     
    	// pêché ici : https://gtk.developpez.com/cours/listes-arbres/#LIV-A-2-a
    	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gpTreeView), FALSE);
     
    	/******************************************************************************/
    	// Boite horizontale 2/2 dans boite verticale
    	pBoxH = gtk_hbox_new(FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(p_main_vbox), pBoxH, FALSE, FALSE, 0);
     
    	// Boutons dans boite horizontale 2
    	for (n=5; n<9; n++) {
    		sprintf(buf, " %d. %s ", n, labels[n-1]);
    		bouton = gtk_button_new_with_label(buf);
    		gtk_box_pack_start(GTK_BOX(pBoxH), bouton, TRUE, FALSE, 0);
    		g_signal_connect(G_OBJECT(bouton), "clicked", G_CALLBACK(boutonClic), NULL);
    	}
    	/******************************************************************************/
    	// Label pour tracer info dernier bouton cliqué
    	gpLabel=gtk_label_new("\nCe label soit etre justifie a droite");
    	gtk_label_set_justify(GTK_LABEL(gpLabel), GTK_JUSTIFY_RIGHT);
    	gtk_container_add(GTK_CONTAINER(p_main_vbox), gpLabel);
    	/******************************************************************************/
    	gtk_widget_show_all(p_win1);
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    int main (int argc, char *argv[]) {
    	gtk_init (&argc, &argv);
    	creInterface();
    	gtk_main ();
    return (0);
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Utilisation de Glade avec Gtk+ - N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2009
    Messages : 9
    Points : 18
    Points
    18

    Par défaut

    Bonjour, et merci gerald3d

    Les modifications (en rouge, c'est tip-top) apportent la solution attendue.
    Merci beaucoup, car je n'aurais jamais trouvé cela tout seul.

    Peut-être que j'aurais fini par chercher à traiter un événement sur le GTK_SCROLLED_WINDOW
    mais pas sur son vadjustment.

    Citation Envoyé par gerald3d Voir le message
    [...] Il te faut connecter un callback au signal "changed" du GtkAdjustment* dans lequel tu changeras la position du GtkScrolledWindow*.


    A ceux qui cherchent comment scroller en fin de fenêtre après ajout d'un élément : voir la réponse de gerald3d

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    mars 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2008
    Messages : 93
    Points : 67
    Points
    67

    Par défaut

    Bonjour un petit coup de pouce pour passer en Gtk3

    et avec quelques petits coups de nettoyage de variable inutilisée

    a noter que j'ai mis gtk+3 à l'épreuve sur la ligne gtk_list_store_set(gpListStore, &iter, 0, "...", -1); devenue inutile en gtk3 ???

    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
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    #include <gtk/gtk.h>
    #include <stdlib.h>
    #include <string.h>
     
    //test.c
    //gcc -std=c11 -Wall -fmax-errors=10 -Wextra test.c -o test `pkg-config --cflags --libs gtk+-3.0 `
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    GtkWidget *gpTreeView, *gpScrollbar, *gpLabel;
    GtkListStore *gpListStore;
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void creInterface();
    void listeAjouter (char *str);
    void boutonClic(GtkWidget *bouton, gpointer data);
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     
    void
    callback_vadj_changed (GtkAdjustment *Vadjust, gpointer userdata)
    {
      gtk_adjustment_set_value(Vadjust, gtk_adjustment_get_upper(Vadjust));
      /* Parametre inutilise */
      (void)userdata;
    }
     
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // listeAjouter : ajouter sText à gpListStore (déclaré en global)
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void listeAjouter (char *sText) {
    //GtkAdjustment* vAjust;
    char buf[80];
    //gdouble lAjust;
    static int nbLignes = 0;
    static GtkTreeIter iter;
     
    	nbLignes++;
    	sprintf(buf, "ligne %2d : %s", nbLignes, sText);
    	printf("*** listeAjouter %s ***\n", buf);
     
    	// !!!! Supprimer d'abord la ligne bidon 
    	//      servant à l'ajustement de l'ascenseur vertical
    	if (nbLignes > 1) gtk_list_store_remove(gpListStore, &iter);
     
    	// Creation et ajout nouvelle ligne au treeView
    	gtk_list_store_append(gpListStore, &iter);
    	gtk_list_store_set(gpListStore, &iter, 0, buf, -1);
     
    	// !!!! Je triche en ajoutant une ligne bidon à la fin
    	//      sinon la dernière ligne réelle contenant buf n'est pas visible
    	gtk_list_store_append(gpListStore, &iter);	
    	//gtk_list_store_set(gpListStore, &iter, 0, "...", -1); inutile en gtk3 ??
     
    	// Ajustement de l'ascenseur vertical
    	/* vAjust = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(gpScrollbar)); */
    	/* lAjust = gtk_adjustment_get_upper(vAjust); */
     
    	/* gtk_adjustment_set_value(vAjust, lAjust); */
     
    	/* printf("    lAjust = %ld\n", lAjust); */
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void boutonClic(GtkWidget *bouton, gpointer data) {
    char buf[80], msg[160];
    gchar* sUtf8;
     
    	strcpy( buf, gtk_button_get_label (GTK_BUTTON(bouton)) );
    	if (strstr(buf, "Quitter")) {
    		printf("\n    ####  SORTIE DEMANDEE  ####\n");
    		gtk_main_quit();
    	}
    	else {
    		sprintf(msg, "<span face=\"Courier New\">Dernier bouton cliqué : '%s'</span>", buf);
    		sUtf8 = g_locale_to_utf8(msg, -1, NULL, NULL, NULL);
    		gtk_label_set_markup(GTK_LABEL(gpLabel), sUtf8);
    		g_free(sUtf8);
     
    		sprintf(msg, "Label du bouton cliqué : '%s' ", buf);
    		listeAjouter(msg);
    	}
    	/* Parametre inutilise */
        (void)data;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    void creInterface() {
    GtkWidget *p_win1, *p_main_vbox, *pBoxH;
    GtkWidget *bouton;// *defil non utilisé
    GtkTreeViewColumn *pColumn;
    GtkCellRenderer *pCellRenderer;
    int n;
    char buf[80];
    static char *labels[] = { "Voir", "Entendre", "Sentir", "Toucher", 
    		"Regarder", "Ecouter", "Humer", "Quitter" };
     
    	// Fenetre 1/1
    	p_win1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title(GTK_WINDOW(p_win1), "41_voir_dernier_ajout_dans_treeView");
    	gtk_window_set_default_size(GTK_WINDOW(p_win1), 580, 180);
    	gtk_container_set_border_width (GTK_CONTAINER (p_win1), 10);
    	g_signal_connect(G_OBJECT(p_win1), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    	/******************************************************************************/
    	// Boite verticale 1/1 dans fenetre 1
    	p_main_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    	gtk_container_add(GTK_CONTAINER(p_win1), p_main_vbox);
     
    	// boite horizontale 1/2 dans boite verticale
    	pBoxH = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
    	gtk_box_pack_start(GTK_BOX(p_main_vbox), pBoxH, FALSE, FALSE, 0);
     
    	// Boutons dans boite horizontale 1
    	for (n=1; n<5; n++) {
    		sprintf(buf, " %d. %s ", n, labels[n-1]);
    		bouton = gtk_button_new_with_label(buf);
    		gtk_box_pack_start(GTK_BOX(pBoxH), bouton, TRUE, FALSE, 0);
    		g_signal_connect(G_OBJECT(bouton), "clicked", G_CALLBACK(boutonClic), NULL);
    	}
    	/******************************************************************************/
    	// Création treeView avec barres de défilement
    	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    	// modele du treeView : 1 colonne de type chaine
    	gpListStore = gtk_list_store_new(1, G_TYPE_STRING);
    	gpTreeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(gpListStore));
     
    	// Creation colonne 1/1
    	pCellRenderer = gtk_cell_renderer_text_new();
    	pColumn = gtk_tree_view_column_new_with_attributes("Je ne veux pas de titre !",
    		pCellRenderer, "text", 0, NULL);
    	gtk_tree_view_append_column(GTK_TREE_VIEW(gpTreeView), pColumn);
     
    	// Ajout barres de défilement 
    	gpScrollbar = gtk_scrolled_window_new(NULL, NULL);
    	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gpScrollbar),
    			GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
    	g_signal_connect (G_OBJECT (gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(gpScrollbar))), "changed", G_CALLBACK (callback_vadj_changed), NULL);
     
     
    	// Associer treeView aux barres de défilement
    	gtk_container_add(GTK_CONTAINER(gpScrollbar), gpTreeView);
     
    	// Associer barres de défilement à la boite verticale
    	//gtk_container_add(GTK_CONTAINER(p_main_vbox), gpScrollbar);
    	gtk_box_pack_start(GTK_BOX(p_main_vbox), gpScrollbar, TRUE, TRUE, 0);
    	// pêché ici : https://gtk.developpez.com/cours/listes-arbres/#LIV-A-2-a
    	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gpTreeView), FALSE);
     
    	/******************************************************************************/
    	// Boite horizontale 2/2 dans boite verticale
    	pBoxH = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
    	gtk_box_pack_start(GTK_BOX(p_main_vbox), pBoxH, FALSE, FALSE, 0);
     
    	// Boutons dans boite horizontale 2
    	for (n=5; n<9; n++) {
    		sprintf(buf, " %d. %s ", n, labels[n-1]);
    		bouton = gtk_button_new_with_label(buf);
    		gtk_box_pack_start(GTK_BOX(pBoxH), bouton, TRUE, FALSE, 0);
    		g_signal_connect(G_OBJECT(bouton), "clicked", G_CALLBACK(boutonClic), NULL);
    	}
    	/******************************************************************************/
    	// Label pour tracer info dernier bouton cliqué
    	gpLabel=gtk_label_new("\nCe label soit etre justifie a droite");
    	gtk_label_set_justify(GTK_LABEL(gpLabel), GTK_JUSTIFY_RIGHT);
    	gtk_container_add(GTK_CONTAINER(p_main_vbox), gpLabel);
    	/******************************************************************************/
    	gtk_widget_show_all(p_win1);
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    int main (int argc, char *argv[]) {
    	gtk_init (&argc, &argv);
    	creInterface();
    	gtk_main ();
    return (0);
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    le programme tourne sur mon ubuntu !!!!!

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

Discussions similaires

  1. problème avec GtkTreeView
    Par medsog dans le forum GTK+ avec C & C++
    Réponses: 10
    Dernier message: 23/03/2012, 18h37
  2. Effet de clipping avec les GtkScrolledWindow
    Par tintin72 dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 12/11/2006, 15h55
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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