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 :

actualisation d'un GtkEntry / GtkEditable


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2009
    Messages : 61
    Par défaut actualisation d'un GtkEntry / GtkEditable
    Bonjour à tous et à toutes,
    petit soucis technique, dans mon programme j'ai un bon nombre de GtkEntry, pour renseigner tout un tas de valeurs,
    dans un premier temps j'avais opté d'utiliser le signal 'activated' du GtkEntry pour récupérer mes données,
    cela oblige à presser la touche entrée à chaque étape qui me permet de lire la valeur entrée et d'actualiser son affichage dans le GtkEntry.
    Seulement voilà je suis un fatigué de cette procédure, j'ai donc décidé d'essayé de changer cela,
    en utilisant le signal 'changed' associé au widget GtkEditable, seulement il y a un hic, exemple:
    Avant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    G_MODULE_EXPORT void on_ax_activate (GtkEntry *Entry)
    {
      const gchar *str;
      char value[50];
      double val;
     
      str=gtk_entry_get_text (EntryGtk);
      val = atof(str);
      printf ("a.x= %lf\n", val);
      sprintf(value,"%lf",val);
      gtk_entry_set_text (EntryGtk, (const gchar *)value);
    }
    aprè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
    G_MODULE_EXPORT void on_ax_changed (GtkEditable *Editable)
    {
      const gchar *str;
      char value[50];
      GtkEntry * EntryGtk;
      double val;
     
      EntryGtk = (GtkEntry *) gtk_builder_get_object (BuilderGtk, "a.x");
      str=gtk_entry_get_text (EntryGtk);
      val = atof(str);
      printf ("a.x= %lf\n", val);
      sprintf(value,"%lf",val);
      gtk_entry_set_text (EntryGtk, (const gchar *)value);
    }
    Dans le premier cas, après avoir entré la valeur "1" dans mon GtkEntry puis pressé la touche entrée la valeur
    est bien sauvée en mémoire et l'affichage du GtkEntry est actualisé pour passé à "1.0000000".
    Dans le second cas (sans presser la touche entrée) si je tape 1 au clavier l'affichage change immédiatement dans le GtkEntry
    ce que je souhaite mais au lieu d'obtenir "1.0000000" je récupère "10.000000" (valeur également stockée en mémoire).

    Que se passe t'il entre le moment où je tape "1" et l'actualisation de l'affichage qui peut expliquer l'erreur ?

    (J'ai pris "1" comme exemple mais cela reste valable peu importe la valeur saisie)

  2. #2
    Membre Expert
    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
    Par défaut
    Je remplacerais le sprintf par un g_strdup_printf (+ g_free) pour être sûr que y a pas de subtils problèmes de débordements mémoire. Et sinon, j'ajouterais des printf ("a.x= %s\n", str); et printf ("a.x= %s\n", value); aux endroits appropriés (ie juste après le gtk_entry_get_text et juste après le g_strdup_printf), ça devrait te donner une piste sur l'endroit exact où le problème se produit.

  3. #3
    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
    Citation Envoyé par Slookeur Voir le message
    Dans le premier cas, après avoir entré la valeur "1" dans mon GtkEntry puis pressé la touche entrée la valeur
    est bien sauvée en mémoire et l'affichage du GtkEntry est actualisé pour passé à "1.0000000".
    Dans le second cas (sans presser la touche entrée) si je tape 1 au clavier l'affichage change immédiatement dans le GtkEntry
    ce que je souhaite mais au lieu d'obtenir "1.0000000" je récupère "10.000000" (valeur également stockée en mémoire).

    Que se passe t'il entre le moment où je tape "1" et l'actualisation de l'affichage qui peut expliquer l'erreur ?

    (J'ai pris "1" comme exemple mais cela reste valable peu importe la valeur saisie)
    Ça me parait bizarre comme comportement, et pas du tout naturel. Un contrôle n'a pas à changer son contenu pendant que je suis en train de l'éditer, sinon cela peut donner n'importe quoi. C'est pour cette raison que c'est en général lors de la perte de focus que le contenu est mis à jour. Exemple: ouvre GIMP, modifie un champ qui a des valeurs en flottant. Le contenu du champ ne sera modifié automatiquement qu'une fois que tu auras donné le focus à un autre widget. Voir les GNOME HIG sur les champs texte :
    In an instant-apply property or preference window, validate the contents of the entry field when it loses focus or when the window is closed, not after each keypress. Exception: if the field accepts only a fixed number of characters, such as a hexadecimal color code, validate and apply the change as soon as that number of characters have been entered.
    Je te conseille donc plutôt de t'orienter vers le signal GtkWidget::focus-out-event.

  4. #4
    Membre confirmé
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2009
    Messages : 61
    Par défaut
    Merci pour vos réponses, je vais étudier cela.
    Joyeuses fêtes de fin d'année.

  5. #5
    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
    Merci, bonnes fêtes à toi aussi

  6. #6
    Membre confirmé
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2009
    Messages : 61
    Par défaut
    Le GtkWidget::focus-out-event est parfait merci pour le tuyau

Discussions similaires

  1. [SWT] actualiser une fenêtre
    Par cootchy dans le forum SWT/JFace
    Réponses: 7
    Dernier message: 15/05/2004, 23h53
  2. [MFC] Probleme d'actualisation d'une listbox
    Par Robleplongeur dans le forum MFC
    Réponses: 5
    Dernier message: 13/05/2004, 14h15
  3. [ JSP ][ Débutant ] Liste déroulante + actualisation de page
    Par captainpouet dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 17/04/2004, 19h51
  4. [CR7]Actualisation des données depuis VB
    Par elifqaoui dans le forum SDK
    Réponses: 4
    Dernier message: 24/11/2003, 13h44
  5. Actualisation d'une liste "dépendante".
    Par Trilby dans le forum ASP
    Réponses: 6
    Dernier message: 19/11/2003, 18h39

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