-
Fonction void en GTK
Bonjou, alors je suis débutant en GTK et je fais donc un programme qui affiche 4 boutons qui portent tous le même label à l'initialisation, et je souhaite écrire une seule fonction void et l'appeler 4 fois tour à tour, à chaque fois que je clique sur l'un des boutons. Cette fonction devra changer le label du bouton. Pouvez vous m'aider svp?! Voilà mon code qui ne compile pas :
#include <stdlib.h>
#include <gtk/gtk.h>
void clic (GtkWidget *pBouton);
// Declaration des variables globales
int x = 1;
int main(int argc, char** argv)
{
//Fenetre principale
GtkWidget* pFenetre=NULL;
// Quatres Boutons
GtkWidget* pBouton1=NULL;
GtkWidget* pBouton2=NULL;
GtkWidget* pBouton3=NULL;
GtkWidget* pBouton4=NULL;
// Initialisation de l'environnement gtk
gtk_init(&argc, &argv);
// Creation d'une fenêtre
pFenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//Titre de la fenêtre
gtk_window_set_title(GTK_WINDOW(pFenetre), "Qui est clicked ?");
// On modifie la taille de la fenetre
gtk_window_set_default_size(GTK_WINDOW (pFenetre), 800, 100);
// On interdit de modifier la taille
gtk_window_set_resizable (GTK_WINDOW (pFenetre), TRUE);
//On centre toujours la fenetre
gtk_window_set_position(GTK_WINDOW(pFenetre),GTK_WIN_POS_CENTER_ALWAYS);
GtkWidget* pHbox=NULL;
// Creation des quatre boutons avec label
pBouton1 = gtk_button_new_with_label ("Je ne suis pas clicked");
pBouton2 = gtk_button_new_with_label ("Je ne suis pas clicked");
pBouton3 = gtk_button_new_with_label ("Je ne suis pas clicked");
pBouton4 = gtk_button_new_with_label ("Je ne suis pas clicked");
// Creation d'une boite
pHbox = gtk_hbox_new (TRUE, 0);
//Ajouts des quatre boutons dans la boite
gtk_box_pack_start (GTK_BOX(pHbox), pBouton1, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(pHbox), pBouton2, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX(pHbox), pBouton3, FALSE, FALSE,0 );
gtk_box_pack_start (GTK_BOX(pHbox), pBouton4, FALSE, FALSE,0 );
// Ajoutons la boite dans la fenetre
gtk_container_add (GTK_CONTAINER(pFenetre), pHbox);
// Affichage de la fenêtre
gtk_widget_show_all(pFenetre);
// Fonction qui capte le signal de la petite croix pour fermer la fenetre
gtk_signal_connect(GTK_OBJECT(pFenetre), "destroy", G_CALLBACK(gtk_main_quit), NULL);
// Fonction qui capte le clic de la souris pour changer le texte
gtk_signal_connect(GTK_OBJECT(pBouton1), "clicked", G_CALLBACK(clic(pBouton1)), NULL);
// Fonction qui capte le clic de la souris pour changer le texte
gtk_signal_connect(GTK_OBJECT(pBouton2), "clicked", G_CALLBACK(clic(pBouton2)), NULL);
// Fonction qui capte le clic de la souris pour changer le texte
gtk_signal_connect(GTK_OBJECT(pBouton3), "clicked", G_CALLBACK(clic(pBouton3)), NULL);
// Fonction qui capte le clic de la souris pour changer le texte
gtk_signal_connect(GTK_OBJECT(pBouton4), "clicked", G_CALLBACK(clic(pBouton4)), NULL);
// Lancement de la boucle événementielle
gtk_main();
return EXIT_SUCCESS;
}
void clic (GtkWidget* pBouton)
{
if (x == 1) {
gtk_button_set_label(GTK_BUTTON(pBouton),"Je suis clicked");
x = 0;
}
else {
gtk_button_set_label(GTK_BUTTON(pBouton),"Je suis clicked");
x = 1;
}
}
-
Bonjour.
Tout d'abord :tagcode: pour encadrer ton code source. C'est bien plus façile pour nos yeux fatigués de lire ton code ;).
Tout signal émit par un Widget demande une fonction callback (la fonction qui sera exécutée lors de l'émission) avec un prototype particulier. Le signal "clicked" pour un GtkButton n'est pas du type void foo (GtkWidget *button);. Il est important de respecter le bon prototype pour être sûr de récupérer les informations nécessaires.
Pour ce faire tu peux aller directement sur le site de Gtk. Voila le lien pour le signal "clicked" : https://developer.gnome.org/gtk3/sta...Button-clicked
Son prototype est donc : void user_function (GtkButton *button, gpointer user_data);.
En partant de là il te faut déjà modifier ton code pour prendre en compte cette remarque.
Une fois fait tu peux attacher tous tes boutons à la même fonction, comme tu l'as fait. Un clic sur un des boutons va te permettre de récupérer dans la callback le pointeur du bouton qui a émit le signal. Tu peux alors utiliser toutes les fonctions liées à ce widget pour le manipuler.
Une petite remarque pour attacher un callback à un signal. On ne spécifie pas les argument dans l'appel à la fonction :gtk_signal_connect(GTK_OBJECT(pBouton1), "clicked", G_CALLBACK(clic(pBouton1)), NULL);
Si tu as besoin de récupérer d'autres données, tu utilises alors le pointeur gpointer user_data. Il est là pour ca :D.
-
OK, merci beaucoup! maintenant, tout fonctionne correctement.
Mais comment je fais pour encadrer mon code source avec la " balise code/code " ?:mrgreen:
-
Tu sélectionnes tout ton code source et tu cliques sur le # dans la barre d'icônes d'édition.