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 :

Vérification d'un champ dans une table [QtGui]


Sujet :

PyQt Python

  1. #1
    Invité
    Invité(e)
    Par défaut Vérification d'un champ dans une table
    Bonjour,

    J'ai une QTableWidget où je souhaite vérifier la donnée saisie par un utilisateur.

    L'entrée doit être un point se composant comme suit "nombre,nombre" (il s'agit d'un point). Nombre est un réel, ex "674097.85,6813.25" sans les guillemets, et sans précision sur le nombre de chiffres après la virgule.

    J'ai pour l'instant la solution de vérifier l'entrée en séparant les parties par la virgule, compter s'il n'y a que 2 parties et vérifier que l'on peut les convertir en float
    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
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    def mon_validateur(str):
        list_s = str.split(',')
        if len(list_s) != 2:
            return False
     
        try:
            float(list_s[0])
            float(list_s[1])
            return list_s
        except ValueError:
            return False
     
     
    test1 = "456,789"
    test2 = "45qsfd7.46, 46768541"
    test3 = "312.45,456,789"
    test4 = "12345.45.54, 456789,789"
     
    print mon_validateur(test1)
    print mon_validateur(test2)
    print mon_validateur(test3)
    print mon_validateur(test4)

    Quelle méthode puis-je utiliser pour arriver au même résultat dans une QTableWidget pour chaque item devant contenir des données de ce type (QValidator, QstyledItemDelegate) ?

    En vous remerciant par avance.

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne suis pas sûr de bien comprendre. Si une case du QTableWidget contient 2 nombres flottants séparés par une virgule, il ne peut s'agir que d'une chaine de caractère, et donc d'une case "normale" (un QTableWidgetItem).

    Si c'est le cas, une manière simple pour vérifier est d'utiliser le signal "cellChanged": à chaque fois que le contenu d'une des cellules concernées aura changé de valeur, le signal pourra lancer une méthode qui vérifiera que la nouvelle chaine modifiée est conforme (=une chaine avec 2 flottants syntaxiquement corrects et séparés par une virgule).
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    C'est en effet ce que je fait. Le signal cellChanged lance "mon_validateur".
    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
     
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt4 import QtGui, QtCore
     
    class Example(QtGui.QWidget):
     
        def __init__(self):
            super(Example, self).__init__()
     
            self.initUI()
     
        def initUI(self):
     
            self.table = QtGui.QTableWidget(1,1, self)
     
            item = QtGui.QTableWidgetItem()
            item.setText("")
            self.table.setItem(0,0, item)
            QtCore.QObject.connect(self.table, QtCore.SIGNAL("cellChanged(int, int)"), self.cellChange)
            self.setGeometry(300, 300, 280, 170)
            self.show()
     
        def cellChange(self, currentRow, currentColumn):
            if self.mon_validateur(self.table.item(currentRow, currentColumn).text()) != False:
                return True
     
            self.table.item(currentRow, currentColumn).setText("")
            return False
     
        def is_numeric(self, str):
            try:
                float(str)
            except (ValueError, TypeError):
                return False
     
            return True
     
        def mon_validateur(self, str):
            list_s = str.split(',')
            if len(list_s) != 2:
                return False
     
            if self.is_numeric(list_s[0]) == False or self.is_numeric(list_s[1]) == False:
                return False
     
            return True
     
    def main():
     
        app = QtGui.QApplication(sys.argv)
        ex = Example()
        sys.exit(app.exec_())
     
     
    if __name__ == '__main__':
        main()
    Ce que je cherche - il me semble avoir vu que c'était possible (QItemDelegate ?) - c'est que l'utilisateur ne puisse pas saisir le moindre caractère interdit (lettres, ponctuations, etc.).
    Dernière modification par Invité ; 05/01/2015 à 18h37.

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Oui, ça devrait fonctionner.

    A mon avis, avec un QTableWidget, on n'a pas besoin d'un delegate: la méthode .setCellWidget() permet d'implanter un widget dans n'importe quelle case.

    On devrait donc pouvoir implanter un QLineEdit. Or, ce widget dispose d'une méthode .setValidator() permettant de faire piloter les saisies par le validator.

    On peut alors utiliser un QRegExpValidator pour définir ce qui est possible ou pas avec un motif d'expression régulière

    Il reste à mettre au point ce motif!

    (je verrai demain si je peux faire un petit code avec ça)

    [Edit] Finalement, grâce à ma curiosité (et aux longues pauses de pub tv!), voilà un petit code qui marche avec un QLineEdit. Il suffira d'implanter ce QLineEdit dans les cases du QTableWidget avec sa méthode .setCellWidget()

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3, PyQt4
     
    import sys
    from PyQt4 import QtCore, QtGui
     
    #############################################################################
    class Fenetre(QtGui.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
     
            self.resize(300, 200)
     
            self.edit = QtGui.QLineEdit(self)
     
            motif = r"^[0-9]+\.[0-9]+,[0-9]+\.[0-9]+$"  #  exemple: 674097.85,6813.25
            regex = QtCore.QRegExp(motif)
            validator = QtGui.QRegExpValidator(regex, self.edit)
            self.edit.setValidator(validator)
     
            # placer les widgets dans la fenêtre
            posit = QtGui.QGridLayout()
            posit.addWidget(self.edit, 0, 0)
            self.setLayout(posit)
     
    #############################################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci c'est exactement ce que je voulais. Je n'avais pas pensé à utiliser une QLineEdit pensant que c'était "l'item" de base en réalité...

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

Discussions similaires

  1. Supprimer un champ dans une table
    Par valerie90 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 24/08/2004, 09h53
  2. Modification du nom d'un champ dans une table
    Par reef1 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/06/2004, 10h55
  3. Réponses: 2
    Dernier message: 19/05/2004, 10h13
  4. changement de type pour un champ dans une table
    Par Missvan dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 23/02/2004, 15h26
  5. Ordre des champs dans une table
    Par patapetz dans le forum Outils
    Réponses: 5
    Dernier message: 30/07/2003, 06h53

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