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 :

Filtrer, focus, et police sur gtkEntry


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 Filtrer, focus, et police sur gtkEntry
    Bonjour à tous,

    Je n'arrive pas à "customiser" mes entrées de chaines de caractères avec des gtkentry. Il y trois points que je n'arrive pas à faire.

    1) Je voudrais "filtrer" la chaine saisie par l'utilisateur. Par exemple, je voudrais que certains caractères (comme par exemple le white space, ou d'autres) ne puisse pas être saisis. En d'autres termes, si un caractère non autorisé est saisie au clavier, il ne dois se passer rien, rien d'affiché, par de déplacement du curseur, etc. Est-ce possible de faire ça, ou bien dois-je recoder ceci à la base en lisant, traitant, et affichant si ok chaque caractère un à un ? Ca me parait bien lourd, et de toute façon, je ne vois même pas bien comme faire ça (même si j'ai quelques idées possibles à explorer).

    2) Y a t'il y moyen de contrôler l'affichage de ce qui est saisi au moment où c'est saisi, je veux dire : font, couleur, etc. J'avais l'idée d'utiliser la librairie Pango et l'encodage UTF8, mais j'ai l'impression qu'il est impossible d'avoir la main sur ce qui est affiché lors de la saisie.

    3) Je n'arrive pas à gérer le focus lors de la saisie. Prenons l'exemple suivant - bidon - ou deux champs de saisie sont positionnés.

    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
    /* travail sur les gtk_entry */
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <string.h>
     
    GtkWidget* pEntry1=NULL;
    GtkWidget* pEntry2=NULL;
     
    int main(int argc,char **argv)
    {
        GtkWidget* pWindow=NULL;
        GtkWidget* pLabel1=NULL;
        GtkWidget* pLabel2=NULL;
        GtkWidget* pHbox1=NULL;
        GtkWidget* pHbox2=NULL;
        GtkWidget* pVbox=NULL;
     
        void entree1(GtkWidget *pEntry, gpointer data); /* callback si saisie entree 1 */
        void entree2(GtkWidget *pEntry, gpointer data); /* callback si saisie entree 2 */
     
        gtk_init(&argc,&argv);
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(pWindow), "travail sur les gtk_entry");
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
        /* Creation des labels */
        pLabel1=gtk_label_new("en attente 1");
        pLabel2=gtk_label_new("En attente 2");
        /* creation des entry */
        pEntry1=gtk_entry_new();
        pEntry2=gtk_entry_new();
        /* on place tout ca dans des boxes */
        pHbox1=gtk_hbox_new(FALSE, 0);
        pHbox2=gtk_hbox_new(FALSE, 0);
        pVbox=gtk_vbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(pHbox1), pLabel1, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(pHbox1), pEntry1, TRUE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(pHbox2), pLabel2, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(pHbox2), pEntry2, TRUE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(pVbox), pHbox1, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(pVbox), pHbox2, TRUE, TRUE, 0);
        /* On verse ca dans la fenetre principale */
        gtk_container_add(GTK_CONTAINER(pWindow), pVbox);
        /* Connexion des signaux */
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
        g_signal_connect(G_OBJECT(pEntry1), "activate", G_CALLBACK(entree1), (GtkWidget*) pLabel1);
        g_signal_connect(G_OBJECT(pEntry2), "activate", G_CALLBACK(entree2), (GtkWidget*) pLabel2);
        /* Affichage de la fenêtré et de tout ce qu'elle contient */
        gtk_widget_show_all(pWindow);
        gtk_main();
        return EXIT_SUCCESS;
    }
    void entree1(GtkWidget *pEntry, gpointer data)
    {
        const gchar *text;
        /* Recuperation du texte contenu dans le GtkEntry */
        text=gtk_entry_get_text(GTK_ENTRY(pEntry1));
        /* Modification du texte contenu dans le GtkLabel */
        gtk_label_set_text(GTK_LABEL((GtkWidget*)data), text);
        /* et on vide la gtk_entry */
        gtk_entry_set_text(GTK_ENTRY(pEntry1), "");
    }
    void entree2(GtkWidget *pEntry, gpointer data)
    {
        const gchar *text;
        /* Recuperation du texte contenu dans le GtkEntry */
        text=gtk_entry_get_text(GTK_ENTRY(pEntry2));
        /* Modification du texte contenu dans le GtkLabel */
        gtk_label_set_text(GTK_LABEL((GtkWidget*)data), text);
        /* et on vide la gtk_entry */
        gtk_entry_set_text(GTK_ENTRY(pEntry2), "");
    }
    Au lancement de l'appli, le focus est sur la premier gtkEntry. Ca ok. En revanche, une fois une saisie réalisée (appuie sur la touche ENTREE), le focus reste sur cette gtkEntry, ce qui oblige l'utilisateur à cliquer sur la seconde avant de pouvoir la saisir. Y aurait-il un moyen de basculer le focus directement sur une autre gtkEntry lorsque une saisie est terminée quelque part ? J'ai bien essayé de jongler avec des gtk_entry_set_activates_default, mais ça ne change rien, et j'ai l'impression d'être à coté du problème à résoudre ici.

    D'avance merci pour toute aide sur ces trois points.

    Eric.

  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
    Filtrer la saisie sur un GtkEntry :

    Le sujet a déjà été traité de mon souvenir mais je n'ai pas pris le temps de rechercher sur le forum. Je te laisse le soin de le faire.
    Maintenant les GtkEntry héritent des GtkWidget. Tu peux peut-être utiliser le signal "key-press-event" pour connecter une fonction callback qui fera le tri sur le dernier caractère saisi.

    Focus :

    Peut-être en utilisant la fonction gtk_widget_grab_focus(); ?

    Police, couleur :

    Il existe la fonction gtk_entry_set_attributes(); qui peut sûrement apporter un début de réponse.

  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
    Citation Envoyé par gerald3d Voir le message
    Filtrer la saisie sur un GtkEntry :

    Le sujet a déjà été traité de mon souvenir mais je n'ai pas pris le temps de rechercher sur le forum. Je te laisse le soin de le faire.
    Maintenant les GtkEntry héritent des GtkWidget. Tu peux peut-être utiliser le signal "key-press-event" pour connecter une fonction callback qui fera le tri sur le dernier caractère saisi.
    J'ai évidement cherché avant de poster, mais n'ai rien trouvé sur ca dans le forum (et ailleurs, d'ailleurs). Je suis preneur d'un lien. Ceci dit, ok, je vais voir et travailler ca en utilisant une fonction callback pour faire le tri. Je ne manquerai pas de donner une solution si j'en trouve une.

    Focus :

    Peut-être en utilisant la fonction gtk_widget_grab_focus(); ?
    Super ! Ca marche au poil. Un problème de résolu. Merci !!

    Police, couleur :

    Il existe la fonction gtk_entry_set_attributes(); qui peut sûrement apporter un début de réponse.
    Je code sous GTK 2. gtk_entry_set_attributes() semble spécifique de GTK 3. Ca ne colle pas. Connaitriez vous une solution utilisable dans GTK 2 ?

    Encore merci pour toute aide sur ce point.

    Eric.

  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 police et plus généralement le style du texte peut-être faut-il passer par les fonctions des GtkWidget :



    Plus généralement il est aussi possible d'utiliser gtk_widget_create_pango_layout();.

  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 gerald3d Voir le message
    Pour la police et plus généralement le style du texte peut-être faut-il passer par les fonctions des GtkWidget :



    Plus généralement il est aussi possible d'utiliser gtk_widget_create_pango_layout();.
    Merci! Encore une fois gtk_widget_create_pango_layout semble être spécifique que GTK 3, ce qui ne colle pas.

    J'ai commencé à creuser l'usage de - par exemple - gtk_widget_modify_font. Ceci me conduit à devoir renseigner (et argumenter) un pointeur sur une struct de type PangoFontDescription ou GtkStyle. Pour ce faire, si j'ai bien compris, je dois utiliser des fonctions comme par exemple pango_font_description_set_weight, etc. Impossible de compiler du code avec ces fonctions qui ne sont pas référencées chez moi (je suis en 2.24.0). Bref, je suis (encore) complètement coincé. Des exemples de codes (comme par exemple ici) serait les bienvenus.

    Encore merci pour votre aide,

    Cordialement, Eric.

  6. #6
    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
    Citation Envoyé par eric1708 Voir le message
    Merci! Encore une fois gtk_widget_create_pango_layout semble être spécifique que GTK 3, ce qui ne colle pas.
    Si tu regardes bien le lien de cette fonction elle est issue de Gtk+ v2.24.

  7. #7
    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 gerald3d Voir le message
    Filtrer la saisie sur un GtkEntry :
    Maintenant les GtkEntry héritent des GtkWidget. Tu peux peut-être utiliser le signal "key-press-event" pour connecter une fonction callback qui fera le tri sur le dernier caractère saisi.
    Euhh, le signal "key-press-event" n'est pas un signal qui peut être émit par un GtkEntry, aux dires de la documentation officielle (https://developer.gnome.org/gtk3/3.4...kEntry.signals). J'ai loupé quelque chose ?

    Encore merci pour votre aide,

    Eric.

  8. #8
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    GtkEntry derive de GtkWidget et "key-press-event" est un signal de GtkWidget.

    Pour ce qui est d'utiliser Pango avec GTK2 il me semble que c'est gtk_widget_create_pango_context () qui peut servir.

  9. #9
    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 pvincent Voir le message
    GtkEntry derive de GtkWidget et "key-press-event" est un signal de GtkWidget.

    Pour ce qui est d'utiliser Pango avec GTK2 il me semble que c'est gtk_widget_create_pango_context () qui peut servir.
    Ok, je vais essayer de voir si je peux capturer le signal "key-press-event".

    Pour le second point, en cherchant sur le web, il semble bien que gtk_widget_create_pango_context soit également spécifique de GTK3, ce qui ne me convient pas. Encore une fois, et de toute façon, des exemples de code seraient utiles pour changer la font dans un GtkEntry.. Je n'arrive pas à en trouver sur le web.

    Même si ces deux questions ne sont pour moi pas encore résolues, merci encore pour votre aide.

    Si d'autres ont des idées..

    Cordialement, ric.

  10. #10
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    gtk_widget_create_pango_layout () et gtk_widget_create_pango_context () semblent exister dans GTK2 depuis pas mal de temps: https://developer.gnome.org/gtk2/sta...e-pango-layout
    Je ne sais pas dans quel environnement tu travaille, mais sous Linux, l'installation de devhelp facilite la recherche dans la documentation GTK.
    D'autre part, en affichant l'index général pour GTK on peut faire une recherche de la chaîne "pango" dans cet index,(aussi bien avec devhelp qu'avec firefox: Ctl-F), ce qui conduit aux fonctions ci-dessus.

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

Discussions similaires

  1. Police sur text
    Par Livingstone dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/01/2006, 15h36
  2. Taille de police sur onglets
    Par stigma dans le forum Access
    Réponses: 8
    Dernier message: 13/01/2006, 16h44
  3. Changement de couleur de police sur une partie d'un caption
    Par kobe dans le forum Composants VCL
    Réponses: 3
    Dernier message: 11/07/2005, 10h18
  4. [Font] utiliser une même police sur Windows et sur Linux ?
    Par iubito dans le forum Interfaces Graphiques en Java
    Réponses: 6
    Dernier message: 10/05/2005, 16h41

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