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 :

passage de parametre


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 82
    Par défaut passage de parametre
    Bonjour,

    Je suis en train de développer une GUI avec glade.

    Dans mon code C, j'ai associé à un bouton la fonction cb_open. Cette fonction doit ouvrir un gtk-assitant (défini dans glade). Comment le passer en paramètre de la fonction cb_open?

    voici mon fichier main.c :

    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
    59
    60
    61
    62
    63
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include "Callbacks.h"
     
     
     
    int main (int argc, char ** argv)
    {
       GtkBuilder  *  p_builder   = NULL;
       GError      *  p_err       = NULL;
     
     
       /* Initialisation de GTK+ */
       gtk_init (& argc, & argv);
     
     
       /* Creation d'un nouveau GtkBuilder */
       p_builder = gtk_builder_new ();
     
       if (p_builder != NULL)
       {
          /* Chargement du XML dans p_builder */
          gtk_builder_add_from_file (p_builder, "GUI.glade", & p_err);
     
          if (p_err == NULL)
          {
             /* 1.- Recuparation d'un pointeur sur la fenetre. */
             GtkWidget * p_win = (GtkWidget *) gtk_builder_get_object (
                p_builder, "window1"
             );
             gtk_window_set_default_size(GTK_WINDOW(p_win), 1024, 768);
             g_signal_connect(G_OBJECT(p_win), "destroy", G_CALLBACK(cb_quit), NULL);
     
             /* 2.- */
             /* Fenetres annexe*/
             GtkWidget * p_NP_assistant = (GtkWidget *) gtk_builder_get_object (
                p_builder, "New_project_assistant"
             );
             gtk_window_set_default_size(GTK_WINDOW(p_NP_assistant), 300, 200);
             g_signal_connect(G_OBJECT(p_NP_assistant), "close", G_CALLBACK(cb_quit_NP_assistant), NULL);
             g_signal_connect(G_OBJECT(p_NP_assistant), "cancel", G_CALLBACK(cb_quit_NP_assistant), NULL);
     
             /* 3.- */
             /* Signaux des bouttons*/
             g_signal_connect (
                gtk_builder_get_object (p_builder, "bouton_Nouveau"),
                "clicked", G_CALLBACK (cb_open), NULL
             );        
     
             gtk_widget_show_all (p_win);
             gtk_main ();
          }
          else
          {
             /* Affichage du message d'erreur de GTK+ */
             g_error ("%s", p_err->message);
             g_error_free (p_err);
          }
       }
     
     
       return EXIT_SUCCESS;
    }
    mon fichier Callbacks.c :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include "Callbacks.h"
     
    void cb_open (GtkWidget * p_wid, gpointer p_data, GtkWidget * p_NP_assistant)
    {
    printf("toto\r\n");
    gtk_widget_show_all (p_NP_assistant);
    }
     
    void cb_quit (GtkWidget * p_wid, gpointer p_data)
    {
       gtk_main_quit ();
    }
     
    void cb_quit_NP_assistant (GtkWidget * p_wid, gpointer p_data)
    {
       gtk_main_quit ();
    }
    Si vous pouviez me donner un/des exemples de passage de paramètres SVP...

    Merci,

    Alex

  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
    Ton code est pas trop mal. Cependant tu fais une erreur classique. Le prototype du callback associé au signal "clicked" est le suivant. Tu ne respectes pas ce prototype.

    Ensuite dans la fonction g_signal_connect(); il y a la fameuse donnée "data". Remplace-la par le pointeur "p_NP_assistant".

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 82
    Par défaut
    Merci pour ta réponse...

    J'ai regardé pour l'utilisation du prototype de "clicked", mais je ne voit pas comment l'implémenter ...

    En ce qui concerne le passage de paramètre, j'ai fait la substitution et ça fonctionne parfaitement.

    Juste pour creuser un peu: Comment je fais pour passer plusieurs paramètres?
    J'ai essayé de les rajouter en les séparant par des virgules, mais mon compilo me dit que g_signal_connect() n'accepte que 4 arguments...

    J'en profite pour te demander encore un renseignement:

    Maintenant que j'arrive à ouvrir mon pop-up, j'aimerais pouvoir le fermer si l'utilisateur clique sur son bouton annuler (ou sa fonction fermeture). Le problème c'est que la fonction gtk_quit() n'existe pas....

    Ou puis-je trouver un listing des fonctions de gtk?

    Merci encore pour ton aide,

    Alex

  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
    Pour la documentation c'est par ici.

    gtk-quit(); n'existe pas, c'est vrai. Son pendant est gtk_main_quit();. Maintenant cette fonction va arrêter la boucle principale de GTK+. En d'autres termes ca va provoquer l'arrêt de ton programme. Ce que tu ne veux pas.
    Pour fermer une fenêtre tu as deux possibilités :
    1. gtk_widget_hide();
    2. gtk_widget_destroy();

    La première possibilité cache la fenêtre sans la détruire. Ca peut être intéeressant si cette fenêtre est souvent appelée.
    La seconde détruit la fenêtre et tout ce qu'elle contient.

    Pour passer plusieurs arguments, la encore tu as deux possiblités:
    1. Créer une structure contenant tous les éléments.
    2. Utiliser le pointeur "data" hérité de GObject.

    Je te conseille vivement la première option. Plus lisible.

    Comment implémenter le callback?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void cb_open (GtkButton *button, GtkWidget * p_NP_assistant)
    {
    printf("toto\r\n");
    gtk_widget_show_all (p_NP_assistant);
    }
    Et la connexion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* Signaux des bouttons*/
             g_signal_connect (
                gtk_builder_get_object (p_builder, "bouton_Nouveau"),
                "clicked", G_CALLBACK (cb_open), p_NP_assistant);
    Une remarque:
    Tu peux assigner directement ton callback dans glade.

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 82
    Par défaut
    super !

    Merci pour toutes ces infos...

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 82
    Par défaut
    salut !

    j'ai essayé ce we d'implémenter la fermeture du popup "assistant".
    (Il est ouvert lors de la création d'un nouveau projet)

    Ça marche sans problème. Cependant, Lorsque j'utilise gtk_widget_destroy(), impossible de le réouvrir (si je veux créer un nouveau projet par exemple).

    Si j'ai bien analysé la chose, c'est du au fait que je déclare mon popup dans le main.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
             GtkWidget * p_NP_assistant = (GtkWidget *) gtk_builder_get_object (
                p_builder, "New_project_assistant"
             );
             gtk_window_set_default_size(GTK_WINDOW(p_NP_assistant), 300, 200);
             g_signal_connect(G_OBJECT(p_NP_assistant), "close", G_CALLBACK(cb_quit_NP_assistant), p_NP_assistant);
             g_signal_connect(G_OBJECT(p_NP_assistant), "cancel", G_CALLBACK(cb_quit_NP_assistant), p_NP_assistant);
    quel est le meilleur choix :

    - créer la fenêtre "assistant" dans le main et utiliser gtk_widget_hide() pour la fermer
    ou
    - la recréer à chaque fois que le bouton "new project" est actionné et dans ce cas utiliser gtk_widget_destroy()


    Alex

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

Discussions similaires

  1. DOS passage de parametre à un .bat
    Par malbaladejo dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 26/11/2014, 15h44
  2. [langage] Passage de parametre lors de l execution
    Par WetzlarMan dans le forum Langage
    Réponses: 4
    Dernier message: 16/03/2004, 13h28
  3. Probleme de passage de parametre a un TQuery
    Par gve21 dans le forum C++Builder
    Réponses: 7
    Dernier message: 15/01/2004, 15h49
  4. Passage de parametre calculé
    Par soazig dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 06/06/2003, 16h25
  5. Passage de parametre a une anim Flash 5
    Par debug dans le forum Intégration
    Réponses: 4
    Dernier message: 03/06/2002, 17h59

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