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 :

Affichage d'une image aprés sa selection dans un filechooser


Sujet :

GTK+ avec C & C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Affichage d'une image aprés sa selection dans un filechooser
    Bonjour,

    J'ai une interface a réalisé en C avec GTK pour un projet scolaire. J'ai réaliser tout ce que je voulais à une exception prêt. Je n'arrive pas à afficher mon image une fois que je l'ais choisis dans une fenêtre filechooser.

    Je code en C.
    J'utilise GTK+ 2.0.
    Je suis sous Ubuntu.

    Je vous présente mon code concernant le callback d'un bouton Ouvrir:

    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
     
    void on_bMenuOuvrir_activate (GtkMenuItem *menuitem,
                                  gpointer user_data)
    {
      GtkWidget *pFileSelection;
      GtkWidget *pParent;
      GtkWidget *pImage;
      gchar *sChemin;
     
      pParent = GTK_WIDGET(user_data);
     
      pFileSelection = gtk_file_chooser_dialog_new("Ouvrir...",
                                                   GTK_WINDOW(pParent),
                                                   GTK_FILE_CHOOSER_ACTION_OPEN,
                                                   GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                                   GTK_STOCK_OPEN, GTK_RESPONSE_OK,
                                                   NULL);
     
      gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE);
     
      switch(gtk_dialog_run(GTK_DIALOG(pFileSelection)))
      {
        case GTK_RESPONSE_OK:
          /* Recuperation du chemin */
          sChemin = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection));
     
          /* On charge l'image */
          gtk_image_set_from_file (GTK_IMAGE(user_data), "Img1.jpg");
     
          g_free(sChemin);
          break;
        default:
          break;
      }
      gtk_widget_destroy(pFileSelection);
    }
    Je voudrais donc afficher l'image dont j'ai le chemin dans ma boite contenant déjà un widget image.

    Ce code n'affiche pas l'image et j'ai ,dans la console, cette erreur:
    (project2:8475): Gtk-CRITICAL **: gtk_image_set_from_file: assertion `GTK_IS_IMAGE (image)' failed

    Valala

    Pouvez vous m'éclairer pour que mon image se charge bien et s'affiche dans ma gtk_image?

    Merci,
    Cordialement,
    Dxdiag

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    T'es sûr que "user_data" pointe bien sur un GtkImage correctement initialisé ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    T'es sûr que "user_data" pointe bien sur un GtkImage correctement initialisé ?
    Je crois oui, comment je peux le vérifier? Le truc, c'est que ça compile et tout, juste au moment de l'affichage il me pète l'erreur que j'ai indiqué.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Tu peux vérifier que tu fais bien un gtk_image_new ou assimilé avant de connecter ton signal, afficher l'adresse de ton GtkImage quand tu viens juste de le créer, et réafficher l'adresse du user_data dans ton callback et voir si c'est les mêmes.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Okay,

    Je commence peut etre avec un code un peu compliquer. Plus simplement ce que je veux faire c'est afficher une image dans ma fenetre que j'ai choisis avec le file chooser.

    On ne peut mettre qu'un parametre pour acceder a ma filechooser donc je ne peux pas y passer ma fenetre.

    J'ai essaye avec une structure, mais j'ai une erreur de pointeur.
    Voici le 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
    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
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    struct sImage
    {
        GtkWidget *pImage;
        GtkWidget *pSelect;
    };
     
    typedef struct sImage *Image;
     
    void on_pButton_clicked(GtkWidget* widget, gpointer data);
     
    int main(int argc, char **argv)
    {
      GtkWidget *pWindow;
      GtkWidget *pVBox;
      GtkWidget *pButton;
      GtkWidget *pImage;
     
      Image i;
      i = malloc(sizeof(struct sImage));
     
      gtk_init(&argc, &argv);
     
      /* Creation de la fenetre */
      pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
      gtk_window_set_title(GTK_WINDOW(pWindow), "3D Cartographe");
      gtk_window_set_default_size(GTK_WINDOW(pWindow), 1024, 768);
      g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
      /* Creation de la GtkVBox */
      pVBox = gtk_vbox_new(FALSE, 0);
      gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
     
     
      /* Creation de l'image */
      pImage = gtk_image_new_from_file(NULL);
      gtk_box_pack_start(GTK_BOX(pVBox),pImage,TRUE,TRUE,1);
      i->pImage = pImage;
     
     
      /* Creation du bouton */
      pButton = gtk_button_new();
      gtk_box_pack_start(GTK_BOX(pVBox),pButton,TRUE,TRUE,0);
      g_signal_connect ((gpointer) pButton, "clicked",
                        G_CALLBACK (on_pButton_clicked),
                        i);
     
      /* Affichage de tous les widget */
      gtk_widget_show_all(pWindow);
     
      gtk_main();
     
      return EXIT_SUCCESS;
    }
     
    void on_pButton_clicked(GtkWidget* widget, gpointer data)
    {
      gtk_image_set_from_file(GTK_IMAGE(data->pImage),"Img1.jpg");
    }
    L'erreur que j'ai est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    gtktest.c: In function 'on_pButton_clicked':
    gtktest.c:60: warning: dereferencing 'void *' pointer
    gtktest.c:60: error: request for member 'pImage' in something not a structure or union
    Voila, est ce que ca vous parle plus qu'a moi?

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Ouep, dans ton callback faut caster ton gpointer data pour qu'il ait le bon type.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Yép,

    J'ai réussi, je castai pas le bon type... alala, noobisme quand tu nous tiens! Je vous donne le code, si ça peut servir à d'autre.

    Il est possible de modifier deux images en meme temps grâce à un type.

    Bonne soirée,
    Merci beaucoup!

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
      struct sImage
      {
          GtkWidget *pImage1;
          GtkWidget *pImage2;
      };
     
      typedef struct sImage *Image;
     
    void on_pButton_clicked(GtkWidget* widget, Image data);
     
    int main(int argc, char **argv)
    {
      GtkWidget *pWindow;
      GtkWidget *pVBox;
      GtkWidget *pButton;
     
     
      Image i;
      i = malloc(sizeof(struct sImage));
     
      gtk_init(&argc, &argv);
     
      /* Creation de la fenetre */
      pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
      gtk_window_set_title(GTK_WINDOW(pWindow), "3D Cartographe");
      gtk_window_set_default_size(GTK_WINDOW(pWindow), 800, 600);
      g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
      /* Creation de la GtkVBox */
      pVBox = gtk_vbox_new(FALSE, 0);
      gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
     
     
      /* Creation de l'image 1*/
      i->pImage1 = gtk_image_new_from_file(NULL);
      gtk_box_pack_start(GTK_BOX(pVBox),i->pImage1,TRUE,TRUE,1);
     
      /* Creation de l'iamge 2*/
      i->pImage2 = gtk_image_new_from_file(NULL);
      gtk_box_pack_start(GTK_BOX(pVBox),i->pImage2,TRUE,TRUE,2);
     
      /* Creation du bouton */
      pButton = gtk_button_new_from_stock ("gtk-open");
      gtk_box_pack_start(GTK_BOX(pVBox),pButton,FALSE,FALSE,0);
      g_signal_connect ((gpointer) pButton, "clicked",
                        G_CALLBACK (on_pButton_clicked),
                        i);
     
     
      /* Affichage de tous les widget */
      gtk_widget_show_all(pWindow);
      gtk_main();
     
      return EXIT_SUCCESS;
    }
     
    void on_pButton_clicked(GtkWidget* widget,Image data)
    {
      GtkWidget *pFileSelection;
      GtkWidget *pParent;
      gchar *sChemin;
     
      pParent = gtk_window_new(GTK_WINDOW_TOPLEVEL);
      pFileSelection = gtk_file_chooser_dialog_new("Ouvrir...",
                                                   GTK_WINDOW(pParent),
                                                   GTK_FILE_CHOOSER_ACTION_OPEN,
                                                   GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                                   GTK_STOCK_OPEN, GTK_RESPONSE_OK,
                                                   NULL);
     
     
      gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE);
      switch(gtk_dialog_run(GTK_DIALOG(pFileSelection)))
      {
        case GTK_RESPONSE_OK:
     
          sChemin = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection));
     
          gtk_image_set_from_file(GTK_IMAGE(data->pImage1),sChemin);
          gtk_image_set_from_file(GTK_IMAGE(data->pImage2),sChemin);
     
          g_free(sChemin);
          break;
        default:
          break;
      }
      gtk_widget_destroy(pFileSelection);
     
    }
    Cordialement,
    dxdiag

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/07/2007, 13h53
  2. [ImageMagick] Affichage d'une image après script
    Par morgan47 dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 10/02/2007, 12h34
  3. Pb d'affichage d'une image à la volée, choisie dans une liste déroulante
    Par Angelseb dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 08/02/2007, 10h53
  4. affichage d'une image apres le chargement de la page
    Par Krubi dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/04/2006, 16h44
  5. Affichage d'une image après insertion dans une base
    Par leloup84 dans le forum Langage
    Réponses: 9
    Dernier message: 24/01/2006, 16h34

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