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

PyQt Python Discussion :

Afficher un float dans un QLineEdit en formattant l'affichage [QtGui]


Sujet :

PyQt Python

  1. #1
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Par défaut Afficher un float dans un QLineEdit en formattant l'affichage
    Bonjour,

    Je démarre la découverte de PySide (1.1.2) avec Python (2.7) et je souhaiterais représenter un float dans un QLineEdit mais en n'affichant qu'un nombre prédéterminé de chiffres après la virgule ( je fais des calculs avec cette valeur mais je ne veux pas alourdir l'affichage).
    J'ai essayé plusieurs méthodes :
    setInputMask, mais la méthode est assez contraignante puisqu'elle limite le nombre de caractère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            self.setInputMask("000.0")
    J'ai essayé d'utiliser un QSpinBox mais là aussi j'ai 2 contraintes : il faut également déterminer une valeur Maximale et d'autre part je voudrais supprimer les flèches "up" et "down" ce que je ne sais pas faire !

    Quelle est la meilleure solution à mettre en oeuvre ?
    Je vous remercie d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Billets dans le blog
    15
    Par défaut
    Hello,

    Tu peux formater une chaîne de caractères (nombres) de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a = 3.52358
    b = "%.2f" % a
    Je t'invite à lire cette page, mais avant tout d'apprendre les bases de Python avant de chercher une solution dans un binding.

    Même si tu vas avoir l'impression de perdre du temps, je te promets que ça ne sera pas le cas.

    J
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

  3. #3
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Par défaut
    Bonjour Jiyuu,

    Merci pour ta réponse ultra rapide
    En fait j'ai démarré la découverte de Python et de Pyside il y a déjà quelques semaines et je me mange les doigts de n'avoir pas fait cette "rencontre" plus tôt ... Je suis effectivement encore loin d'avoir tout lu et tout compris mais ce "chemin" est néanmoins plein de satisfactions.
    J'ai déjà regardé le formatage de données et c'est justement là mon problème d'aujourd'hui : comment obtenir le même rendu pour le formatage (en affichage) d'un QLineEdit ? Il me manque peut-être quelques "truc" au niveau de la syntaxe de QInputMask.
    Je suis en train de chercher également vers les "feuilles de style" sans résultat pour l'instant.
    Je pensais également "farfouiller" vers les "delegate" (que j'utilise par ailleurs ...) mais puis-je l'utiliser dans le cas d'un widget isolé qui n'est pas relié à une vue ??
    Beaucoup de questions, quelques pistes mais pas encore de solutions ...

    Je te remercie pour tes "lumières"
    @+

  4. #4
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Billets dans le blog
    15
    Par défaut
    Pour reprendre le problème au départ, quand tu dis :
    je souhaiterais représenter un float dans un QLineEdit
    tu entends et veux faire quoi exactement ?
    Un calcul est fait et tu l'envoies dans un QLineEdit ?
    Tu ne veux pas que l'affichage de la valeur (renseignée automatiquement ou manuellement) ai plus de X chiffres après la virgule ?
    Tu veux vraiment que l'utilisateur puisse remodifier la valeur du widget ? (peut-être utiliser un QLabel ?)

    J'ai l'impression que c'est plutôt la deuxième question.

    Une piste serait peut-être d'intercepter le fait que le QLineEdit perde le focus (signal) et y associer une fonction (slot) qui reformate sa valeur.

    Tu peux t'inspirer de ce tutoriel.
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

  5. #5
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Par défaut
    Je fais décrire un peu plus précisément le contexte :
    J'ai une liste de produits avec lesquels je souhaite établir une formule de mélange :
    Produit A : 100
    Produit B : 200
    Produit C : 300

    L'application va calculer la somme de ces produits (100 + 200 + 300) : 600 que je place dans le QLineEdit (affichage sans décimales). L'application détermine également les pourcentages respectifs de chacun des composants =>

    Produit A : 0,16 %
    Produit B : 0,32 %
    Produit C : 0,48 %

    Les pourcentages sont également arrondis (à l'affichage uniquement) et l'ensemble de ces données sont dans une QTableView adossée à une base SQlite.

    Ce que je souhaite également pouvoir faire :

    1 - Modifier les pourcentages des produits (en respectant la somme des % = 100% bien sûr ) et redéterminer les poids respectifs des composants en prenant comme somme totale la valeur du QLineEdit (la valeur du QLineEdit est prise alors comme paramètre d'entrée du calcul ainsi que les pourcentages modifiés)

    2 - Modifier la valeur totale du mélange (passer d'un mélange de 600 à 1000) et recalculer la valeur de chacun des composants en respectant les proportions affichées(la valeur du QLineEdit et les pourcentages sont alors les valeurs d'entrées du calcul)

    Le QLineEdit est donc utilisé à la fois en affichage mais aussi en interface de saisie.
    J'arrive à faire fonctionner le code comme souhaité il me manque que le formatage d'affichage de la somme des composants ..

    J'espère que mon explication est claire (?), sinon je veux apporter des compléments.

    Merci pour vos idées.
    @+

  6. #6
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Billets dans le blog
    15
    Par défaut
    Tu as déjà pondu un bout de code ?

    Si oui, tu pourrais nous le mettre (sauf la partie QTableView et Sql car je ne pense pas que ton souci soit là).

    Si non, je crois vraiment que la solution réside dans l'interception des signaux de pertes de focus et modifications des valeurs des widgets.

    Pour ma part, je ferai ainsi :
    Après l'intervention manuelle de l'utilisateur, la perte de focus du QWidget reformate de la chaîne de caractère de celui-ci.
    Le changement de texte d'un QWidget génère un recalcule des valeurs des QWidgets.

    Signaux possibles pour le focus :
    http://qt.developpez.com/doc/4.7/qwidget/#focusinevent

    Signal pour le changement de valeur :
    http://qt.developpez.com/doc/4.7/qlineedit/#textchanged
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

  7. #7
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Par défaut
    Mon code est encore très brouillon je donne quelques extraits pour comprendre où j'en suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...        
    self.pdsHuile = QtGui.QLineEdit()   ' c'est la fameuse somme ...
    pour déclencher le calcul
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.pdsHuile.returnPressed.connect(self.MAJ_pdsHuile)
    Le calcul des quantités par produit en fonction de la somme saisie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        def MAJ_pdsHuile(self):
            sommeHuile = float(self.pdsHuile.text())
            records = self.session.query(Huile).filter(Huile.flgs == True)
            for pourcent in records:
                pourcent.qfor = float(pourcent.pfor) * sommeHuile
            self.model_Huile.refresh()
            self.session.commit()
    Calcul de la somme des composant et des proportions déclenché lors de la modification de la vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def dataChanged(self, index = None):
            if  index is None or index.column() == 10:
                sommeHuile = self.session.query(func.sum(Huile.qfor)).scalar()
                self.pdsHuile.setText(str(sommeHuile))
                records = self.session.query(Huile).filter(Huile.flgs == True)
                for pourcent in records:
                    pourcent.pfor = float(pourcent.qfor) / float(sommeHuile)
    Un petit bouton "Calcul" pour déclencher le recalcul des quantités par produit après modification des proportions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            btnCALCUL = QtGui.QPushButton('CALCUL')
            btnCALCUL.clicked.connect(self.calculSommePercentHuile)
    calcul des quantités par produit à partir des nouvelles proportions saisies:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        def calculSommePercentHuile(self):
            sommePercentHuile = self.session.query(func.sum(Huile.pfor)).scalar()
            diff = 1 - sommePercentHuile
            if diff == 0:
                sommeHuile = float(self.pdsHuile.text())
                records = self.session.query(Huile).filter(Huile.flgs == True)
                for pourcent in records:
                    pourcent.qfor = float(pourcent.pfor) * sommeHuile
                self.model_Huile.refresh()
                self.session.commit()
            else:
                commonDlgs.showMessageDlg("Erreur dans la somme, il y a %s en moins" % diff)
    Voilà pour les morceaux de code, mais je vais creuser aussi tes pistes.
    @+

  8. #8
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Billets dans le blog
    15
    Par défaut
    Bon, j'ai jamais trop eu l'habitude de tout donner, mais ça fait si longtemps que je vais faire une entorse... et puis ça va peut-être plaire à quelqu'un

    je sais pas si c'est que tu cherches, mais d'après ce que j'ai compris ça devrait t'aider.

    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
    # -*- coding: iso-8859-1 -*-
     
     
    import sys
    from PySide import QtGui
    from PySide import QtCore
     
    class Frame(QtGui.QWidget):
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
     
     
            self.resize(200,200)
     
     
            self.setFont(QtGui.QFont("Verdana")) 
     
     
            self.setWindowTitle("Test")
     
            self.lineedit0 = QtGui.QLineEdit("3.2552", self) 
            self.lineedit0.move(0, 25)
            actVal0 = float(self.lineedit0.text())
            newVal0 = "%.2f" % actVal0
            self.lineedit0.setText(newVal0)
     
            self.lineedit1 = QtGui.QLineEdit("2.658", self) 
            self.lineedit1.move(0, 55)
            actVal1 = float(self.lineedit1.text())
     
     
            self.result = QtGui.QLabel(self)
            self.result.move(0, 75)
     
            result = "%.2f" % (actVal0 * actVal1)
            self.result.setText(result)
     
     
            self.lineedit0.textChanged.connect(self.calc)
            self.lineedit1.textChanged.connect(self.calc)
     
            self.lineedit0.lostFocus.connect(self.arrondi)
            self.lineedit1.lostFocus.connect(self.arrondi)
     
     
     
        def calc(self) :
            actVal0 = float(self.lineedit0.text())
            actVal1 = float(self.lineedit1.text())
     
            result = "%.2f" % (actVal0 * actVal1)
            self.result.setText(result)
     
        def arrondi(self) :
            actVal0 = float(self.lineedit0.text())
            newVal0 = "%.2f" % actVal0
            self.lineedit0.setText(newVal0)
     
            actVal1 = float(self.lineedit1.text())
            newVal1 = "%.2f" % actVal1
            self.lineedit1.setText(newVal1)
     
     
     
     
    app = QtGui.QApplication(sys.argv)
    frame = Frame()
    frame.show()
    sys.exit(app.exec_())
    C'est moche et pas optimisé mais normalement ça fonctionne
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

  9. #9
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Par défaut
    Merci Jiyuu , le petit morceau de code qui me manquait :
    newVal0 = "%.2f" % actVal0
    self.lineedit0.setText(newVal0)
    C'était pourtant simple ...
    Mais il reste quand même un ti problème. La valeur stockée dans le widget est tronquée (ici à 2 décimales), je perds donc la précision de la valeur de la somme pour les calculs ultérieurs
    J'avais essayé, à une époque, de surclasser une QLineEdit en ajoutant une propriété "value" qui représentait la valeur réelle (format float ou decimal) de la donnée. Je transférais alors la valeur formatée de "value" dans "text" mais tous les calculs étaient faits avec "value". J'ai abandonné pensant qu'il y avait peut être plus simple ... (?)

    Autrement connais-tu une technique pour supprimer les flèches "up" et "down" d'un QSpinBox ?

    Merci encore pour ton aide.
    @+

  10. #10
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Billets dans le blog
    15
    Par défaut
    Citation Envoyé par Triton972 Voir le message
    Merci Jiyuu , le petit morceau de code qui me manquait :


    C'était pourtant simple ...
    Mais il reste quand même un ti problème. La valeur stockée dans le widget est tronquée (ici à 2 décimales), je perds donc la précision de la valeur de la somme pour les calculs ultérieurs
    J'avais essayé, à une époque, de surclasser une QLineEdit en ajoutant une propriété "value" qui représentait la valeur réelle (format float ou decimal) de la donnée. Je transférais alors la valeur formatée de "value" dans "text" mais tous les calculs étaient faits avec "value". J'ai abandonné pensant qu'il y avait peut être plus simple ... (?)
    Au pire tu peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    newVal0 = "%.2f" % actVal0
    self.realVal = actVal0
    self.lineedit0.setText(newVal0)
    et tu fais en sorte de toujours garder une copie de ta valeur réelle en mémoire.

    Citation Envoyé par Triton972 Voir le message
    Autrement connais-tu une technique pour supprimer les flèches "up" et "down" d'un QSpinBox ?
    Huuummm, QSpinBox héritant de QAbstractSpinBox, je dirai ça, mais je vois pas en quoi ça va solutionner ton problème de calcul avec une valeur non arrondie.
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

  11. #11
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Par défaut
    Huuummm, QSpinBox héritant de QAbstractSpinBox, je dirai ça, mais je vois pas en quoi ça va solutionner ton problème de calcul avec une valeur non arrondie.
    Mouais tu as raison, je me suis un peu mélangé les pinceaux avec le "delegate" de SpinBox que j'ai fait dans une autre vue ...

    Enfin, je te remercie pour toutes les bonnes infos que tu m'as donné et que je vais creuser.

    Merci également pour la technique de suppression des flèches du Spinbox que je n'avais pas trouvée malgré mes recherches !

    Bonne Nuit, @+

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

Discussions similaires

  1. formatter/afficher une date dans un text_field
    Par Javix dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 06/05/2009, 10h28
  2. Afficher un float dans une textBox
    Par thonyyzz dans le forum C++
    Réponses: 6
    Dernier message: 22/04/2008, 09h25
  3. [OLE Excel] formatter ecriture float dans une cellule
    Par netah25 dans le forum C++Builder
    Réponses: 1
    Dernier message: 24/01/2006, 10h09
  4. Comment afficher FLASH directement dans le EMAIL
    Par Bilmagic dans le forum Flash
    Réponses: 3
    Dernier message: 05/06/2003, 00h38
  5. Réponses: 2
    Dernier message: 10/06/2002, 11h03

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