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);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~