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+ Discussion :

Fonction void en GTK


Sujet :

GTK+

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 15
    Par défaut 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;
    }

    }

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Tout d'abord 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 .

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 15
    Par défaut
    OK, merci beaucoup! maintenant, tout fonctionne correctement.
    Mais comment je fais pour encadrer mon code source avec la " balise code/code " ?

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Tu sélectionnes tout ton code source et tu cliques sur le # dans la barre d'icônes d'édition.

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/08/2008, 14h49
  2. Fonction pour quitter gtk
    Par Senaku-seishin dans le forum GTK+
    Réponses: 7
    Dernier message: 14/04/2008, 20h36
  3. différence entre fonction() et fonction(void)
    Par ram-0000 dans le forum C++
    Réponses: 8
    Dernier message: 07/11/2007, 17h31
  4. Fonctions mathématiques sur GTK
    Par Print' dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 24/01/2007, 23h36
  5. utiliser une fonction VOID pour des blocs relationnels ?
    Par ctobini dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 11/09/2006, 16h16

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