Bonjour,

J'essaie de développer un programme sous GTK avec --> glade <--.
Je m'en vois et je suis un peu déçu. Enfin bref.

Je commence a utiliser les Combo box.
J'ai voulu utiliser la commande "gtk_combo_box_append_text".
J'ai eu droit a deux erreurs au lancement de mon programme.
Internet m'a informer que je n'étais pas le seul a m'en plaindre.

Je viens de m'apercevoir que cette commande semble bien être disponible sans erreur si:
1) élément actif reste a -1
2) le champs élément possède un choix pré-remplie d'au moins une ligne.

Mais auparavant, croyant cette commande inaccessible avec glade, j'ai tenté de faire une routine recomposant la liste de choix d'une combobox.
Je vous l'a propose mais prenez tous ce qui est écrit avec de large pincette;
Je ne comprend pas grand chose.
Tout commentaires est la bienvenue.

D'abord ça qui n'est pas de moi:
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
 
#include <stdlib.h>
#include <gtk/gtk.h>
#include <stdlib.h>
 
#include <errno.h>
#include <string.h>
#include <glib-2.0/glib.h>
 
GtkBuilder  *p_builder =NULL;
 
int chargeInterface(void)
{
	GError    *p_err= NULL;
	GtkWidget *mainwin;
 
	/* Creation d'un nouveau GtkBuilder */
	p_builder = gtk_builder_new();
 
	if (p_builder == NULL) return EXIT_FAILURE;
 
	/* Chargement du XML dans p_builder */
	gtk_builder_add_from_file (p_builder, "interface.xml", & p_err);
 
	if (p_err != NULL)
	{
		/* Affichage du message d'erreur de GTK+ */
		g_error ("%s", p_err->message);
		g_error_free (p_err);
	}
 
	gtk_builder_connect_signals ( p_builder, NULL );
	mainwin= GTK_WIDGET(gtk_builder_get_object(p_builder,"window1"));
	gtk_widget_show_all ( mainwin );
 
 
	return EXIT_SUCCESS;
}
 
 
/* Routine principale. */
int main (int argc, char ** argv)
{
	/* Initialisation de GTK+ et ouverture de la fenêtre. */
	gtk_init (& argc, & argv);
	if (chargeInterface()==EXIT_FAILURE)
	{
		printf("mettre ici la commande de sortie urgente en erreur");
		return EXIT_FAILURE;
	}
 
	gtk_main ();
 
	return EXIT_SUCCESS;
}
et enfin le voilà:
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
 
#include <gtk/gtk.h>
#include <stdlib.h>
 
extern GtkBuilder *p_builder;
 
 
/*	Change le conteneur de la Combo box. */
void modifieComboBox(GtkComboBox* p_combo)
{
	GtkTreeModel *modelfilter= NULL;
	GtkTreeIter iter;
	GtkListStore *store;
 
	/* Création du nouveau magasin qui contiendra 1 colone de type texte. */
	store = gtk_list_store_new(1, G_TYPE_STRING);
 
	/* Ajoute une ligne dans notre magasin qui n'en n'a pas. */
	gtk_list_store_append(store, &iter);
 
	/* Cette ligne aura pour valeur. */
	gtk_list_store_set(	store,		// Magasin store.
						&iter,		// Sur la ligne actuellement pointée.
						0,			// Sur la colone 0.
						"Nouveau",	// texte écrit.
						-1);		// Pas d'autres insertion.
 
	/*	Maintenant, je vais tenté de substituer la
		liste store actuelle de ma combo box par
		celle que je viens de fabriquer. */
 
	/* On créer un nouveau GtkTreeModel. */
    modelfilter= gtk_tree_model_filter_new(GTK_TREE_MODEL(store),NULL);
 
	/* On fait sa prière. */
	gtk_combo_box_set_model(p_combo, modelfilter);
 
	return;
}
 
 
void on_button1_clicked(GtkWidget *pEntry, gpointer data)
{
	GtkComboBox *p_combo=0;
	p_combo= GTK_COMBO_BOX(gtk_builder_get_object(p_builder,"combobox1"));
	modifieComboBox(p_combo);
//gtk_combo_box_append_text (p_combo, "mon beau texte");
	return;
}
Pour les curieux l'interface
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
 
<?xml version="1.0"?>
<!--Generated with glade3 3.4.5 on Mon Dec 29 21:49:25 2008 -->
<interface>
  <object class="GtkListStore" id="model1">
    <columns>
      <column type="gchararray"/>
    </columns>
    <data>
      <row>
        <col id="0">ligne indispensable</col>
      </row>
    </data>
  </object>
  <object class="GtkWindow" id="window1">
    <child>
      <object class="GtkVBox" id="vbox1">
        <property name="visible">True</property>
        <child>
          <object class="GtkComboBox" id="combobox1">
            <property name="visible">True</property>
            <property name="model">model1</property>
            <child>
              <object class="GtkCellRendererText" id="renderer1"/>
              <attributes>
                <attribute name="text">0</attribute>
              </attributes>
            </child>
          </object>
        </child>
        <child>
          <object class="GtkButton" id="quitter">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="label" translatable="yes">quitter</property>
            <signal handler="gtk_main_quit" name="clicked"/>
          </object>
          <packing>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="button1">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="label" translatable="yes">Modifier la combo box</property>
            <signal handler="on_button1_clicked" name="clicked"/>
          </object>
          <packing>
            <property name="position">2</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>
Cette routine n'a pas d''autre intérêt que de polluer votre site préféré.
Je me suis dit que fort ma foi, si je pouvais afficher à la place d'un texte, des données sur plusieurs colonnes, elle pouvait être interessante.
J'ai donc fait ces modifications suivantes.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
/* Cette ligne remplacant l'ancienne. Seuil changement : un 2 au lieu du 1.
store = gtk_list_store_new(2, G_TYPE_STRING);
...
/* Cette ligne s'ajoutant à l'ancienne. Un 1 au lieu du 0*/
	gtk_list_store_set(	store, &iter, 1, "yoLaFleur", -1);
Ma combo box se grise et j'ai de magnifiques erreurs quant je clique sur le bouton "modifer la combo box" :

(testeFonctionGTK:11006): Gtk-WARNING **: /build/buildd/gtk+2.0-2.14.4/gtk/gtkliststore.c:253: Invalid type (null)

(testeFonctionGTK:11006): Gtk-CRITICAL **: gtk_list_store_append: assertion `GTK_IS_LIST_STORE (list_store)' failed

(testeFonctionGTK:11006): Gtk-CRITICAL **: gtk_list_store_set_valist: assertion `GTK_IS_LIST_STORE (list_store)' failed

(testeFonctionGTK:11006): Gtk-CRITICAL **: gtk_list_store_set_valist: assertion `GTK_IS_LIST_STORE (list_store)' failed

(testeFonctionGTK:11006): Gtk-CRITICAL **: gtk_tree_model_filter_new: assertion `GTK_IS_TREE_MODEL (child_model)' failed


Comment faire ?
J'ai bien pris connaissance du document
"Bien utiliser les GtkComboBox et GtkComboBoxEntry par Franck Hecht"
mais je n'ai pas compris grand chose pour l'instant.

Mon code ne vaux rien ? ou je touche au but a votre avis ?

Voilà voilà, merci de m'avoir lu jusqu'au bout.