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 :

toggle button "silencieux"


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut toggle button "silencieux"
    Bonjour à tous,

    J'ai besoin d'un widget un peu spécial. Ca ressemble comme deux gouttes d'eau à un toggle button, et le code suivant en donne un exemple d'utilisation:

    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
    /* travail sur toggle button */
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    int actif=0;
    GtkWidget *pButton1; /*  bouton 1 toggle */
    GtkWidget *Plabel; /* un label */
     
    int main(int argc, char **argv)
    {
        /* déclaration des widgets */
        GtkWidget *pWindow; /*fenetre principale */
        GtkWidget *pButton2; /*  bouton 2 */
        GtkWidget *pVBox; /* une box verticale */
     
        void OnDestroy(GtkWidget *pWidget, gpointer pData); /* fonction call back destroy */
        void Press_Button(GtkButton *button, gpointer user_data); /* fonction boutton 1 */
     
        /* Initialisation de GTK+ */
        gtk_init(&argc, &argv);
        /* création de la fenetre */
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        /* définition des paramètres de la fenetre */
        gtk_window_set_position(GTK_WINDOW(pWindow), GTK_WIN_POS_CENTER);
        gtk_window_set_title(GTK_WINDOW(pWindow), "Test toggle button");
        /* création de la box verticale */
        pVBox = gtk_vbox_new(FALSE, 0);
        /* création du bouton 1 toggle */
        pButton1 =  gtk_toggle_button_new();
        /* creation du label */
        Plabel=gtk_label_new("non");
        /* on l'ajoute dans le button toggle */
        gtk_container_add(GTK_TOGGLE_BUTTON(pButton1), Plabel);
        /* création du bouton 2 */
        pButton2 = gtk_button_new_with_label("changement");
        /* ajout des deux bouttons dans la boite  verticale */
        gtk_box_pack_start(GTK_BOX(pVBox), pButton1, FALSE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(pVBox), pButton2, FALSE, TRUE, 0);
        /* ajout de la GtkVBox à la fenetre */
        gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
        /* Connexion des signaux */
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(OnDestroy), NULL);
        g_signal_connect(G_OBJECT(pButton2),"pressed", G_CALLBACK(Press_Button), NULL);
        /*affichage de la fenetre */
        gtk_widget_show_all(pWindow);
        /* Demarrage de la boucle evenementielle */
        gtk_main();
        return EXIT_SUCCESS;
    }
    void OnDestroy(GtkWidget *pWidget, gpointer pData){
        /* Arret de la boucle evenementielle */
         gtk_main_quit();
    }
    void Press_Button(GtkButton *button, gpointer user_data) {
        /* modif statut */
        if (actif)
            {
                actif=0;
                gtk_label_set_text (Plabel, "non");
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (pButton1), FALSE);
            }
        else
            {
                actif=1;
                 gtk_label_set_text (Plabel, "oui");
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (pButton1), TRUE);
            }
    }
    So far, so good.

    Ce dont j'ai besoin, c'est d'un widget comme ca, mais qui ne reçoive aucun signaux (et de fait aucun signal ne lui est connecté dans le code ci-dessus) et qui ne fasse rien (i.e., ne change pas de statut) lorsque l'utilisateur click dessus. Je veux en fait me servir de ce genre de widgets pour fournir graphiquement une série d'informations à l'utilisateur, et l'utilisateur ne doit pas pouvoir modifier cette information.

    Je pourrais (j'imagine) créer mon propre widget en me servant du widget de toggle button déjà existant, mais je ne sais pas faire, et surtout je soupçonne qu'il existe un moyen de bloquer l'interaction entre l'utilisateur et ce genre de widgets. Non? J'ai beau chercher, je n'ai rien trouvé, cependant. Toute aide sur ce point est la bienvenue.

    D'avance merci,

    Eric.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    salut,

    J'ai un peu de mal à comprendre ce que tu souhaites.
    Je veux en fait me servir de ce genre de widgets pour fournir graphiquement une série d'informations à l'utilisateur
    Tu veux dire que tu veux que l'utilisateur clique sur ce widget pour afficher un graphique ailleurs ?

    Ce dont j'ai besoin, c'est d'un widget comme ca, mais qui ne reçoive aucun signaux (et de fait aucun signal ne lui est connecté dans le code ci-dessus) et qui ne fasse rien (i.e., ne change pas de statut) lorsque l'utilisateur click dessus.
    Si tu ne connectes pas de signal au bouton1 et que tu ne fasse rien qui touche au bouton1 dans le callback du bouton2 alors tu as bien un widget(le bouton1) qui ne reçoit aucun signaux et qui ne fait rien. Mais du coup, il ne sert effectivement à rien ???

    Il faut que tu expliques plus clairement la chose. Pour moi en tout cas ,c'est trop confus...

  3. #3
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Désolé si je n'ai peut-être pas été assez clair..

    Citation Envoyé par rollbich Voir le message
    Tu veux dire que tu veux que l'utilisateur clique sur ce widget pour afficher un graphique ailleurs ?
    Non, je ne veux pas que l'utilisateur clique dessus, et qui plus est, je ne veux pas que le bouton "réagisse" si l'utilisateur clique dessus (ceci était déjà expliqué dans mon post précédent). Je veux utiliser une série de widgets de ce type pour fournir à l'utilisateur toute une série d'informations sur l'état d'un système, comme un tableau de bord.

    Citation Envoyé par rollbich Voir le message
    Si tu ne connectes pas de signal au bouton1 et que tu ne fasse rien qui touche au bouton1 dans le callback du bouton2 alors tu as bien un widget(le bouton1) qui ne reçoit aucun signaux et qui ne fait rien. Mais du coup, il ne sert effectivement à rien ???
    Si, il sert à donner un information (binaire s'il n'y en a qu'un) à l'utilisateur. S'il y en a n, l'information est d'ordre 2**n, etc.

    Dans le bout de code que je donne, effectivement, le widget n’émet aucun signal, mais il reste "cliquable" et change de statut sous l'action de l'utilisateur, ce que je ne veux pas.

    Suis-je plus clair? Je veux bien expliquer d'avantage si nécessaire..

    Merci pour votre temps en tout cas,

    Eric.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    C'est bien plus clair maintenant.
    Tu peux me tutoyer (si tu le souhaites), moi je le fais systématiquement.

    Non, je ne veux pas que l'utilisateur clique dessus,
    Tu souhaites donc cacher ce widget et lorsque tu veux montrer une information, le faire apparaître ?

    Pourquoi alors n'utilises-tu pas un label au lieu d'un bouton toggle ? Ainsi, tu n'auras plus l'effet 'cliquable'. Tu caches/montres le widget avec gtk_widget_hide/show.
    Ou si tu veux un effet tableau de bord, tu peux 'wrapper' le label dans un event_box et tu peux changer la couleur du fond de l'event_box pour faire l'effet hide/show.

  5. #5
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Citation Envoyé par rollbich Voir le message
    C'est bien plus clair maintenant.
    Tu peux me tutoyer (si tu le souhaites), moi je le fais systématiquement.


    Tu souhaites donc cacher ce widget et lorsque tu veux montrer une information, le faire apparaître ?

    Pourquoi alors n'utilises-tu pas un label au lieu d'un bouton toggle ? Ainsi, tu n'auras plus l'effet 'cliquable'. Tu caches/montres le widget avec .
    Ou si tu veux un effet tableau de bord, tu peux 'wrapper' le label dans un event_box et tu peux changer la couleur du fond de l'event_box pour faire l'effet hide/show.
    Merci pour la réponse, mais :

    L'option gtk_widget_hide/show ne convient pas car (1) en mode "show" le widget dont je parle reste "cliquable" et (2) je veux que le widget apparaisse dans ses deux états possibles. Donc ca ne va pas. Je ne veux rien cacher !

    Je peux effectivement toujours "jongler" avec des labels et leur couleur, dans une event_box (quoi que je ne sache pas comment modifier la couleur de fond) ou avec d'autres solutions (e.g., avec une gtk_table, et enjoliver avec des gtk_hseparator ou des gtk_vseparator, etc.), mais le rendu est vraiment pauvre je trouve par rapport à ce qu'offre "l'esthétique" des toggle buttons, façon on/off.

    N'y a t'il aucun moyen d'afficher un boutton et d'empecher que l'utilisateur le modifie en cliquant dessus? Ca m'étonne, en fait.

    D'autres idées ?

    (et encore merci pour votre aide).

    Eric.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    bon, c'est ma dernière cartouche...

    J'ai rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     gtk_widget_set_sensitive (GTK_BUTTON(pButton1), FALSE);
    et enlevé les set_active dans le callback.

    Dis moi si c'est ça que tu voulais sinon malheureusement, j'ai rien d'autre à te proposer.

    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
    /* travail sur toggle button */
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    int actif=0;
    GtkWidget *pButton1; /*  bouton 1 toggle */
    GtkWidget *Plabel; /* un label */
     
    int main(int argc, char **argv)
    {
        /* déclaration des widgets */
        GtkWidget *pWindow; /*fenetre principale */
        GtkWidget *pButton2; /*  bouton 2 */
        GtkWidget *pVBox; /* une box verticale */
     
        void OnDestroy(GtkWidget *pWidget, gpointer pData); /* fonction call back destroy */
        void Press_Button(GtkButton *button, gpointer user_data); /* fonction boutton 1 */
     
        /* Initialisation de GTK+ */
        gtk_init(&argc, &argv);
        /* création de la fenetre */
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        /* définition des paramètres de la fenetre */
        gtk_window_set_position(GTK_WINDOW(pWindow), GTK_WIN_POS_CENTER);
        gtk_window_set_title(GTK_WINDOW(pWindow), "Test toggle button");
        /* création de la box verticale */
        pVBox = gtk_vbox_new(FALSE, 0);
        /* création du bouton 1 toggle */
        pButton1 =  gtk_toggle_button_new();
        gtk_widget_set_sensitive (GTK_BUTTON(pButton1), FALSE);
        /* creation du label */
        Plabel=gtk_label_new("non");
        /* on l'ajoute dans le button toggle */
        gtk_container_add(GTK_TOGGLE_BUTTON(pButton1), Plabel);
        /* création du bouton 2 */
        pButton2 = gtk_button_new_with_label("changement");
        /* ajout des deux bouttons dans la boite  verticale */
        gtk_box_pack_start(GTK_BOX(pVBox), pButton1, FALSE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(pVBox), pButton2, FALSE, TRUE, 0);
        /* ajout de la GtkVBox à la fenetre */
        gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
        /* Connexion des signaux */
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(OnDestroy), NULL);
        g_signal_connect(G_OBJECT(pButton2),"pressed", G_CALLBACK(Press_Button), NULL);
        /*affichage de la fenetre */
        gtk_widget_show_all(pWindow);
        /* Demarrage de la boucle evenementielle */
        gtk_main();
        return EXIT_SUCCESS;
    }
    void OnDestroy(GtkWidget *pWidget, gpointer pData){
        /* Arret de la boucle evenementielle */
         gtk_main_quit();
    }
    void Press_Button(GtkButton *button, gpointer user_data) {
        /* modif statut */
        if (actif)
            {
                actif=0;
                gtk_label_set_text (Plabel, "non");
            }
        else
            {
                actif=1;
                 gtk_label_set_text (Plabel, "oui");
            }
    }

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

Discussions similaires

  1. Problème radio button espaces et quotes
    Par gamiel dans le forum Langage
    Réponses: 27
    Dernier message: 21/12/2011, 11h52

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