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 :

connecter une image dans un 'treeview' à un callback


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 56
    Points : 54
    Points
    54
    Par défaut connecter une image dans un 'treeview' à un callback
    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 :
    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
     
    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;
    le fichier .c avant gtk_main :
    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
     
    //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);
    et la fonction ou j'ajoute des lignes (appelée par des signaux à la sigaction) :
    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
     
    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;
    	}
    }
    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.
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     gtk_widget_add_events(sParam->solve_it, GDK_BUTTON_PRESS_MASK);
    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.

    config : kubuntu 8.04, gtk+-2.0

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    Re,

    Je pensais aussi mettre un bouton dans la liste, je pourrais ainsi connecter facilement une fonction à celui-ci mais quel type mettre dans gtk_list_store_new(N_Signal ,G_TYPE_STRING, G_TYPE_? ) ?
    Merci,

    edit : ben nan, il n'existe aucune "sous classe" de cellrenderer qui prenne un bouton, cf gtk :
    GObject
    .+----GInitiallyUnowned
    ..+----GtkObject
    ...+----GtkCellRenderer
    .... +----GtkCellRendererText
    .... +----GtkCellRendererPixbuf
    .... +----GtkCellRendererProgress
    .... +----GtkCellRendererSpinner
    .... +----GtkCellRendererToggle

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 56
    Points : 54
    Points
    54
    Par défaut drapeau blanc
    Bon bah ça ne m'a pas l'air possible (à part peut être en faisant des cell renderer maison).
    je l'ai fait avec ges gtk_tree_selection et ca marche.
    Je met en résolu ou pas ?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/08/2007, 10h50
  2. Comment copier une image dans le presse papier.
    Par cprogil dans le forum Langage
    Réponses: 7
    Dernier message: 09/09/2003, 15h54
  3. Peut on mettre une image dans une BD MySQL ?
    Par maddog2032 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 25/07/2003, 16h18
  4. Une image dans un composant ?
    Par bjl dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/03/2003, 11h28
  5. [VB6] [Excel] Insérer une image dans une feuille
    Par mathias dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 09/10/2002, 07h44

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