Bonjour à tous,
J'ai un treview à deux colonnes, l'une contient une chaine de caractères et l'autre un pixbuf, je souhaiterais que lorsqu'on clique sur l'image, une fonction soit appelée, j'ai essayé ceci mais sans succès, la fonction n'est pas appellée :
mon .h :
le fichier .c avant gtk_main :Code:
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 enum//pour numeroter les colonnes { Message, Solve_It, N_Signal }; //third notebook : signals incoming from serial port typedef struct GSignals//mes liststore et listview { //table of signals GtkListStore* all; //tabe viewale GtkWidget* ListView; //iterator GtkTreeIter iterS; }tsGSignals; typedef struct GSignalParam//des parametres uniques pour chaque fonction de callback { //set image clickable GtkWidget *event_box; GtkWidget *solve_it; char param[8]; }tsGSignalParam;
et la fonction ou j'ajoute des lignes (appelée par des signaux à la sigaction) :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 //je pense que c'est une facon assez classique qui ne necessite pas trop d'explication sGVar.sGS.all = gtk_list_store_new(N_Signal, G_TYPE_STRING, GDK_TYPE_PIXBUF ); sGVar.sGS.ListView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(sGVar.sGS.all)); temp_string = g_strdup_printf("signaux"); gtk_notebook_append_page(GTK_NOTEBOOK(sGVar.note_book), GTK_WIDGET(sGVar.sGS.ListView), gtk_label_new(temp_string)); //show the list //message cell_renderS = gtk_cell_renderer_text_new(); columnS = gtk_tree_view_column_new_with_attributes("message", cell_renderS, "text", Message, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(sGVar.sGS.ListView), columnS); //solve it cell_renderS = gtk_cell_renderer_pixbuf_new(); columnS = gtk_tree_view_column_new_with_attributes("résoudre", cell_renderS, "pixbuf", Solve_It, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(sGVar.sGS.ListView), columnS);
Ca ne m'étonne pas beaucoup que ca ne marche puisque le signal est connecté à l'event box alors que j'utilise le pixbuf de l'image contenu dans l'event box pour l'affichage mais liststore demande un pixbuf.Code:
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 void AddSignal(eEvent event, char* param) { printf("signal added\n"); //je creer un nouvel ensemble de parametres tsGSignalParam* sParam = malloc(sizeof(tsGSignalParam)); //avec un event box pour capter un signal (cf image dans la doc de gtk ) sParam->event_box = gtk_event_box_new(); sParam->solve_it = gtk_image_new_from_file("images/solve_it"); //je met l'image dans l'event box gtk_container_add (GTK_CONTAINER (sParam->event_box), sParam->solve_it); gtk_list_store_append(sGVar.sGS.all, &(sGVar.sGS.iterS)); switch(event) { case cProbe_Join : gtk_list_store_set(sGVar.sGS.all, &(sGVar.sGS.iterS), Message, "nouvelle sonde", Solve_It, gtk_image_get_pixbuf(GTK_IMAGE(sParam->solve_it)), -1); g_signal_connect (G_OBJECT (sParam->event_box), "button_press_event", G_CALLBACK (SignalAddProbe), (gpointer)sParam); break; case cProbe_Leave : gtk_list_store_set(sGVar.sGS.all, &(sGVar.sGS.iterS), Message, "sonde perdue", Solve_It, gtk_image_get_pixbuf(GTK_IMAGE(sParam->solve_it)), -1); g_signal_connect (G_OBJECT (sParam->event_box), "button_press_event", G_CALLBACK (SignalRemoveProbe), (gpointer)sParam); break; default : gtk_list_store_set(sGVar.sGS.all, &(sGVar.sGS.iterS), Message, "signal inconnu", Solve_It, gtk_image_get_pixbuf(GTK_IMAGE(sParam->solve_it)), -1); break; } }
Bref, j'ai regardé avec les colonnes, les gtk_treview_get_selection et les cellrenderer sans succès.
Autre point : en connectant mon signal, je passe des paramètres, puisque j'ai une liste, est-ce-que chaque ligne sera connectée avec les paramètres qui lui sont propres (les tsGSignalParam*) ou aurai-je un programme bien buggé et plein de fuites mémoires ?
Meri de votre aide, n'hésitez pas à me reprendre si je ne suis pas clair, c'est mon premier post.
edit : faire
avant de connecter le signal ne donne rien non plus, n'y at-il pas moyen de mettre l'image sous forme de WIdget plutot que de pixbuf dans la liststore ? Je pense que je pourrais ainsi capter les signaux.Code:
1
2 gtk_widget_add_events(sParam->solve_it, GDK_BUTTON_PRESS_MASK);
config : kubuntu 8.04, gtk+-2.0