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 :

3 probleme avec GTK


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 46
    Points
    46
    Par défaut 3 probleme avec GTK
    slt j’ai ecrit une fonction qui prend 2 valeur numerique (avec 2 Scrollbar) et effectue un traitement avec ,mais j’ai rencontré 2 probleme :
    1- comment on fait pour recuperer la valeur des 2 scrollbar lrsq j’appuye sur le bouton « valider » ?
    2- Je transmet la valeur comment a une autre fonction ?
    3- est ce quelqu'un peut m'expliquer svp cmt on utilise le g_signal_connect correctement svp ?
    merci
    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
    void verification_section(GtkWidget*Awindow ,gpointer data )
    {
        GtkWidget *window=NULL,*boite=NULL,*alert=NULL;
        GtkWidget *champ=NULL,*panier_selection=NULL;
        GtkWidget *bouton[3],*select_code=NULL,*select_section=NULL,*titre_code=NULL,*titre_section=NULL;
        gint reponse,min_code,max_code;
        gint code_produit,*code_section=NULL;
     
        const gchar *text_1,*text_2;
        gpointer *b;
        GtkWidget *a;
     
        min_code=code_plus_petit(l_a);//fct sans importance juste pour determiner 
        //les limites du scrollbar
        max_code=code_plus_grand(l_a);
          if (min_code==-1) //si fichier vide a amerliorer
        {
        alert=gtk_message_dialog_new (NULL,GTK_DIALOG_MODAL ,GTK_MESSAGE_ERROR
        ,GTK_BUTTONS_OK,"Fichiers non charges!");
     
     
        reponse=gtk_dialog_run(GTK_DIALOG(alert));
        gtk_widget_destroy(alert);
        charger_les_fichiers(a,b);//charge le contenu des fichiers on peut s'en passer
     
     
     
        }
     
     
     
        else
        {
                //creation de la fentre
       window=gtk_dialog_new_with_buttons("verification de la section", NULL
        ,GTK_DIALOG_MODAL,GTK_STOCK_OK,GTK_RESPONSE_OK,
            GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,
            NULL);
     
     
     
     
        panier_selection=gtk_vbox_new(TRUE,5);
        select_code=gtk_spin_button_new_with_range (min_code,max_code,1);
        min_code=code_section_plus_petit(l_s);
        max_code=code_section_plus_grand(l_s);
        select_section=gtk_spin_button_new_with_range (min_code,max_code,1);
        titre_code=gtk_frame_new("selectionner un code produit" );
        titre_section=gtk_frame_new("selectionner un code section" );
     
        code_produit=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(select_code));
        gtk_container_add(GTK_CONTAINER(titre_code), select_code);
        gtk_container_add(GTK_CONTAINER(titre_section), select_section);
     
        gtk_box_pack_start(GTK_BOX(panier_selection),titre_code,FALSE,FALSE,0);
        gtk_box_pack_start(GTK_BOX(panier_selection),titre_section,FALSE,FALSE,0);
     
     
        code_section=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(select_code));
     
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->vbox), panier_selection, TRUE, FALSE, 0);
     
        gtk_widget_show_all(GTK_DIALOG(window)->vbox);
     
     
     
         reponse=gtk_dialog_run(GTK_DIALOG(window));
     
        code_produit= gtk_range_get_value(GTK_RANGE(titre_code));
     
        if (reponse==GTK_RESPONSE_OK)
        {
            puts("c ok!");
     
     
        }
        else
        {
             puts("annule par l'utilisateur");
        }
        printf("%d",code_produit);//il m'affiche tjrs 0
     
    gtk_widget_destroy(window);
     
        }
     
     
     
    }

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par hunter99
    1- comment on fait pour recuperer la valeur des 2 scrollbar lrsq j’appuye sur le bouton « valider » ?
    gtk_range_get_value Il faut biensûr que tes widgets soient accessibles depuis ton callback, le mieux étant de les mettres dans une structure et de passer l'adresse de celle-ci par le biais de g_signal_connect en tant que dernier argument de cette fonction !

    Citation Envoyé par hunter99
    2- Je transmet la valeur comment a une autre fonction ?
    Bin par le biais des arguments pardis ! Montre le prototype de la fonction et je te dirais comment faire au mieux ! Il faut biensûr que tu appelles cette fonction dans ton callback qui récupère les valeurs des GtkScrollbar !

    Citation Envoyé par hunter99
    3- est ce quelqu'un peut m'expliquer svp cmt on utilise le g_signal_connect correctement svp ?
    Quel est ton problème ? Cette fonction s'utilise ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    s_signal_connect (
       G_OBJECT (widget),
       "signal",
       G_CALLBACK (fonction),
       adresse
    );
    • widget étant le widget auquel tu veux associer une fonction callback par le biais du signal signal que tu auras choisi de traiter !
    • signal étant le signal que tu souhaite traiter, pour connaître les signaux utilisables, il faut voir dans la ref du widget concerné ou voir sinon dans celle du widget parent !
    • fonction étant le callback que tu souhaites lier au signal et donc à ton widget. Attention à respecter la signature de ces fonctions. Chaque signature est visible depuis la description des signaux de chaque widgets dans la ref officielle de GTK+ comme mentionné plus haut !
    • adresse étant l'adresse d'une variable, un pointeur sur une structure ou toute autre donnée que tu souhaite passer à ton callback. Cette transmission se fait par le biais du dernier argument d'un callback, celui de type gpointer ! Tu peux également passer la valeur NULL si tu ne souhaite pas envoyer de données supplémentaires à ton callback !


    Et si tu ne sais toujours pas, hé bien je te conseil vivement de lire un cours d'initiation à GTK+ : http://gtk.developpez.com/cours/gtk2/

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 46
    Points
    46
    Par défaut
    ok merci bcp , j'ai pu resoudre ce probleme apres moult tentatives en utilisant les reponses de la boite du dilaogue (j'ai reorganisé mon code source et transformé tte mes fenetres en boite de dialogue (comme tu m'a) dit sauf la principale) .Mais la je me suis replanté c le meme probleme que celui de la derniere fois j'ai un scrollbar dont je veux passer la valeur a une fct qui effectue le traitment , le scrollbar est bien defini ainsi que tte mes fcts mais lrsq le programme va transferer la valeur du scrollbar ça affiche
    (GTKapp.exe:2736): GLib-GObject-WARNING **: invalid cast from `GtkButton' to `GtkSpinButton'
    (GTKapp.exe:2736): Gtk-CRITICAL **: gtk_spin_button_get_value_as_int: assertion
    `GTK_IS_SPIN_BUTTON (spin_button)' failed
    enrtre
    je pense que j'ai pas reussi le callback du bouton "cout amortissement du produit"
    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
    void open_calcul_window(GtkWidget *pwindow,gpointer data)
    {
        guint reponse;
        GtkWidget *window,*bouton[3],*panier=NULL,*select_code,*titre_code;
        int i,min_code=code_plus_petit(l_a),max_code=code_plus_grand(l_a);
        guint resultat;
        window=gtk_dialog_new_with_buttons("Calcul des couts",NULL,GTK_DIALOG_MODAL,
        GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,NULL);
       // window=gtk_message_dialog_new (NULL,GTK_DIALOG_MODAL ,GTK_MESSAGE_ERROR
        //,GTK_BUTTONS_OK,"Fichiers non charges!");
     
        select_code=gtk_spin_button_new_with_range (min_code,max_code,1);
     
        titre_code=gtk_frame_new("selectionner un code produit" );
        gtk_container_add(GTK_CONTAINER(titre_code), select_code);
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->vbox),titre_code,FALSE,FALSE,0);
     
        bouton[0] =gtk_button_new_with_mnemonic("_Cout d'amortissement de ce produit ");// c ici 
        bouton[1] =gtk_button_new_with_mnemonic("_cout d'amortissement du produit et ses composant(s)");
        bouton[2]=gtk_button_new_with_mnemonic("Cout _matiere ");
     
         g_signal_connect(G_OBJECT(bouton[0]), "clicked", G_CALLBACK(open_cout_amort_normal)
        ,(GtkWidget*)select_code);
     
        panier=gtk_vbox_new(TRUE,1);
     
        for (i=0;i<3;i++)
        {
        gtk_box_pack_start(GTK_BOX(panier), bouton[i], FALSE, FALSE, 0);
        }
     
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->vbox),panier, TRUE, FALSE, 0);
     
        gtk_widget_show_all(window);
        reponse=gtk_dialog_run(GTK_DIALOG(window));
     
     
        gtk_widget_destroy(window);
     
     
    }
     
    void open_cout_amort_normal(GtkWidget* spin ,gpointer data)
    {
     
        guint valeur=1000;
     
        valeur=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin));
        printf("\nvaleur :%d\n",valeur);
    }
    merci bcp de ton aide

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    C'est normal, toi dans ton second callback, tu utilises le premier paramètre mais comme dit plein de fois sur ce forum, cet argument n'est autre que le widget qui à réceptionné le signal donc ici, ton GtkButton. Quand tu passes ton GtkSpinButton par le biais de la fonction g_signal_connect, c'est dans le second argument qu'il faut que tu pioche, celui de type gpointer.

    Il faut donc que tu récupère ton widget à partir de là suivant cette méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GtkSpinButton * widget = data;
    et tu récupère donc la valeur de ton Spin à partir de ce pointeur qui lui pointe vers ton GtkSpinButton !

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 46
    Points
    46
    Par défaut
    ok merci bcp .

Discussions similaires

  1. Probleme avec GTK+ (affichage)
    Par virdisss dans le forum C
    Réponses: 0
    Dernier message: 19/02/2011, 17h05
  2. cross compilation avec mingw : probleme avec GTK+
    Par superZozo dans le forum GTK+
    Réponses: 10
    Dernier message: 25/04/2010, 16h36
  3. Probleme avec Opencv (GTK 2.0)
    Par ouxss dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 14/01/2010, 13h12
  4. probleme de compilation avec GTK+
    Par claire_cartier dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 06/05/2007, 16h26
  5. [GTK]problème avec GTK+ sur DEV-C++
    Par afrikha dans le forum Dev-C++
    Réponses: 7
    Dernier message: 01/10/2005, 14h13

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