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 :

Récupérer chemin après file chooser


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37

    Informations forums :
    Inscription : Juin 2010
    Messages : 241
    Par défaut Récupérer chemin après file chooser
    Bonjour,
    j'aimerais récupérer le chemin d'un fichier dans mon main. C'est pour choisir d'afficher une image quelconque.
    J'utilise gtk_file_chooser_get_filename et je transmet un pointer de gchar à ma fonction callback pour recevoir le chemin, mais quand j'affiche la valeur du gchar, rien n'a été écris...
    Voici mon bout de code :
    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
     
    Main {
    // Zone Image
    const gchar* path_image;path_image=g_strdup("null");
    g_signal_connect (G_OBJECT(button_o_im), "clicked", GTK_SIGNAL_FUNC (ouvrir_image), &path_image);
    }
     
    callback.c : 
    void ouvrir_image(gchar  *path_image)
    {
        GtkWidget *dialog;
        dialog = gtk_file_chooser_dialog_new ("Open File",
    				      NULL,
    				      GTK_FILE_CHOOSER_ACTION_OPEN,
    				      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    				      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
    				      NULL);
    if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
      {
        path_image = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
      }
      gtk_widget_destroy (dialog);
     
    }
    Je recois toujours "null" comme valeur...
    Merci de votre aide.

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    C'est normal, tu manipules mal les pointeurs. Tu founis bien &path_image en paramètre à la callback, mais tu l'utilises comme un gchar* alors que c'est un gchar**.

    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
    Main {
    // Zone Image
    gchar* path_image = NULL;
    g_signal_connect (G_OBJECT(button_o_im), "clicked", GTK_SIGNAL_FUNC (ouvrir_image), &path_image);
    }
     
    callback.c : 
    void ouvrir_image(gchar  **path_image)
    {
        GtkWidget *dialog;
        g_assert (path_image != NULL);
        dialog = gtk_file_chooser_dialog_new ("Open File",
    				      NULL,
    				      GTK_FILE_CHOOSER_ACTION_OPEN,
    				      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    				      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
    				      NULL);
    if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
      {
        *path_image = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
      }
      gtk_widget_destroy (dialog);
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37

    Informations forums :
    Inscription : Juin 2010
    Messages : 241
    Par défaut
    J'ai bien remplacé mon *gchar en **gchar ( bien que je ne comprenne pas encore bien pourquoi).
    Mais cela ne fonctionne pas : je fais un printf hors du cb, et je reçois (null) ...

    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
     
    callback.c
     
    void ouvrir_image(GtkWidget *widget, gchar  **path_image)
    {
        GtkWidget *dialog;
        g_assert (path_image != NULL);
        dialog = gtk_file_chooser_dialog_new ("Open File",
    				      NULL,
    				      GTK_FILE_CHOOSER_ACTION_OPEN,
    				      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    				      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
    				      NULL);
    if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
      {
        *path_image = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
     
      }
      gtk_widget_destroy (dialog);
     
    }
     
    Main : 
    gchar* path_image = NULL ;
    g_signal_connect (G_OBJECT(button_o_im), "clicked", GTK_SIGNAL_FUNC (ouvrir_image), &path_image);
     
    printf("%s",path_image);
    Quel est le problème ?

  4. #4
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Tu peux donner plus de code ? Parce que là je ne sais pas trop si c'est un extrait représentatif de ce que tu fais. Par exemple path_image doit avoir une durée de vie suffisante pour pouvoir recevoir la valeur (cela ne peut être une variable locale à ta callback). De même, si ton printf est juste après la connexion du signal tu ne verras rien...

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37

    Informations forums :
    Inscription : Juin 2010
    Messages : 241
    Par défaut
    Tu avais raison à propos de la position du printf : j'ai essayé après le lancement de la boucle ( gtk_main (); ) et cela m'affiche bien le chemin.
    Cependant, j'ai cet fonction est à la fin de mon programme et donc connaitre la valeur du chemin à ce moment ne me sert à rien...
    je peux donner un peu plus de code, mais je crains que cela ne confuse plus que cela n'éclaire.

  6. #6
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    GTK est un système, comme beaucoup d'autres, qui utilise une pompe à évènements.

    Tu n'est pas supposé appeler quoi que ce soit après gtk_main, sauf libérer de la mémoire, ou faire des actions que tu souhaites avant que le programme ne se termine. Comme dans beaucoup d'autres toolkits graphiques, tout passe par un système de signal/évènement et de callback. En gros ta callback récupérant le chemin de fichier n'est là que pour stocker le chemin dans un endroit persistant, pour qu'une autre callback puisse la manipuler en réponse à l'évènement de ton choix.

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37

    Informations forums :
    Inscription : Juin 2010
    Messages : 241
    Par défaut
    Ok, j'ai fait une structure avec un gchar et un kwidget où je transmet le chemin et l'endroit où doit être chargé l'image et avec le g_printf dans le callback cela fonctionne.
    Seulement, je ne sais pas quand remplir ma structure ( faut-il recréer un évenement?) et peut-on entrer le kwidget dans ma structure à l'appel ?

    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
     
    /* struct de base */
    typedef struct
    {
       gchar* texte;
       GtkWidget * wiwi;
    }
    Test;
     
    cb.c
    void ouvrir_image(GtkWidget *widget, gpointer data)
    {
        GtkWidget *dialog;
        Test * chemin = (Test *) data;
        dialog = gtk_file_chooser_dialog_new ("Open File",
    				      NULL,
    				      GTK_FILE_CHOOSER_ACTION_OPEN,
    				      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    				      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
    				      NULL);
    if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
      {
        chemin->texte = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
        GtkWidget *image=gtk_image_new_from_file(chemin->texte);
        gtk_box_pack_end(GTK_BOX (chemin->wiwi), image, FALSE, FALSE, 10);
     
      }
      gtk_widget_destroy (dialog);
     
    }
     
    main
     
        g_signal_connect (G_OBJECT(button_o_im), "clicked", GTK_SIGNAL_FUNC (ouvrir_image), &test);

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37

    Informations forums :
    Inscription : Juin 2010
    Messages : 241
    Par défaut
    Ok , j'ai réussi. J'ai repris un code basique de zéro et cela fonctionne.
    Merci pour votre aide.
    Voilà le code si ça intéresse quelqu'un.

    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
     
     
    void ouvrir_image(GtkWidget *pButton, gpointer data)
    {
        Image_struc_cb *structure;
        GtkWidget *dialog;
     
        /*Récupération de la pBox */
        structure = (Image_struc_cb*) data;
     
            dialog = gtk_file_chooser_dialog_new ("Open File",
    				      NULL,
    				      GTK_FILE_CHOOSER_ACTION_OPEN,
    				      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    				      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
    				      NULL);
    if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
      {
     
              /*Création de l'image*/
       // gtk_image_clear(structure->pImage);
        gtk_image_set_from_file(GTK_IMAGE (structure->pImage), gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)));
      }
      gtk_widget_destroy (dialog);
    }

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/12/2012, 17h21
  2. Récupérer PK apres insertion
    Par Mandotnet dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 10/04/2006, 18h36
  3. [VBA-E]Récupérer chemin du fichier de données d'un graphique
    Par pimouss76 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 31/03/2006, 14h41
  4. Réponses: 2
    Dernier message: 02/02/2006, 15h00
  5. [VB.NET] [ADO.NET] Récupérer id après insertion
    Par nashouille dans le forum Accès aux données
    Réponses: 9
    Dernier message: 09/01/2005, 15h54

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