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 :

Expression régulière avec Qt Designer ?


Sujet :

PyQt Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Points : 5
    Points
    5
    Par défaut Expression régulière avec Qt Designer ?
    Bonsoir,

    Existe-t-il une possibilité de configurer une regexp pour un QLineEdit directement dans ses propriété directement dans Qt Designer?
    Je cherche configurer un Lineedit afin de ne pouvoir saisir d'une adresse email et cela directement lors de sa saisie et si possible en configurant ses propriétés dans Qt Designer?

    merci

  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,

    Citation Envoyé par EXAPAT Voir le message
    Existe-t-il une possibilité de configurer une regexp pour un QLineEdit directement dans ses propriété directement dans Qt Designer?
    Je ne crois pas que ce soit possible, mais je connais 2 solutions pour utiliser un widget personnalisé avec Designer.

    1ère solution: créer le widget personnalisé dans une forme telle que Designer peut l'utiliser directement comme n'importe quel widget d'origine. J'utilise ça quand ce widget personnalisé a des chances d'être utilisé couramment dans mes projets. Ce n'est pas simple, mais c'est la voie royale et quand c'est au point, ça marche très bien. Voilà un petit tuto de la méthode que j'utilise (c'est encore du PyQt4): http://python.jpvweb.com/mesrecettes...uveaux_widgets.

    2ème solution: dans Designer, on utilise le widget d'origine, mais dans le code qui importe la page issue de Designer, on le remplace par le widget personnalisé.

    Voilà un petit exemple de la 2ème solution avec un regex de validation des adresses email.

    Pour le remplacement, voilà la principe:
    - sous Designer, on place un QLineEdit avec le nom "lineEdit"
    - Dans le code principal, on crée le QLineEdit personnalisé en sous-classant QLineEdit, et en plaçant toute son initialisation dans la méthode "configuration".
    - la fenêtre du programme importe le code issu de Designer, mais remplace son QLineEdit par celui qui est personnalisé avec ces 2 lignes de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            self.ui.lineEdit.__class__ = MonLineEditWidget
            self.ui.lineEdit.configuration()
    Voilà le code complet de l'exemple (PyQt5):

    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
    72
    #! /usr/bin/python3
    # -*- coding: utf-8 -*-
    # Python v3 PyQt5
     
    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from test_ui import Ui_Form
     
    #############################################################################
    class MonLineEditWidget(QtWidgets.QLineEdit):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
            self.configuration()
     
        #========================================================================
        def configuration(self):    
     
            regex = QtCore.QRegExp(r"^[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)*@[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)*(\.[a-zA-Z]{2,6})$")
            validator = QtGui.QRegExpValidator(regex, self)
            self.setValidator(validator)
     
            self.textEdited.connect(self.suivisaisiemail)
     
            # mettre des coins arrondis et changer les couleurs
            self.style = """
                 border: 1px solid gray;
                 border-radius: 5px;
                 padding: 3px 3px 3px 3px;
                 color: blue; 
                 background: %s;
                 selection-color: yellow;
                 selection-background-color: blue;
                 """
     
            self.setStyleSheet(self.style % "yellow")
     
        #========================================================================
        def suivisaisiemail(self):
            """appelé à chaque changement de texte saisi dans le QLineEdit
            """
            testvalid = self.validator().validate(self.text(), 0)
            etat = testvalid[0] # état de la validation par le regex
            if testvalid[1]=="":
                self.setStyleSheet(self.style % "yellow")
            elif etat==QtGui.QRegExpValidator.Intermediate:
                self.setStyleSheet(self.style % "orange")  
            elif etat==QtGui.QRegExpValidator.Acceptable:
                self.setStyleSheet(self.style % "yellow")      
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
     
            # initialiser la partie définie avec designer
            self.ui = Ui_Form()
            self.ui.setupUi(self)
     
            # remplacer le QLineEdit mis avec designer par MonLineEditWidget
            self.ui.lineEdit.__class__ = MonLineEditWidget
            self.ui.lineEdit.configuration()
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Les effets pendant la saisie sont les suivants:
    - au lancement, le fond du QLineEdit est jaune
    - dès qu'on tape le 1er caractère, le fond devient orange
    - on ne peut pas taper un caractère interdit dans le regex. Exemples d'interdiction: un espace, un 2ème '@', un '.' doublé, etc...
    - dès que l'adresse email est complète et syntaxiquement correcte, le fond du QLineEdit redevient jaune.

    Concernant le regex des adresses email: c'est ce que j'utilise pour les vérifications d'un de mes projets pour déceler des fautes de frappes. Cela ne provoque pas d'interdiction mais une alerte à l'utilisateur (type "vous êtes sûr?"). Il y a certainement des regex plus solides.

    [edit]: pour que le code précédent s'exécute, il faut, bien sûr ajouter un code issu de Designer et converti en Python, placé dans un fichier appelé ici test_ui.py et contenant un simple QLineEdit sous le nom lineEdit.

    Par exemple (PyQt5):

    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
    # -*- coding: utf-8 -*-
     
    # Form implementation generated from reading ui file 'test_ui.ui'
    #
    # Created by: PyQt5 UI code generator 5.5
    #
    # WARNING! All changes made in this file will be lost!
     
    from PyQt5 import QtCore, QtGui, QtWidgets
     
    class Ui_Form(object):
        def setupUi(self, Form):
            Form.setObjectName("Form")
            Form.resize(400, 300)
            self.lineEdit = QtWidgets.QLineEdit(Form)
            self.lineEdit.setGeometry(QtCore.QRect(140, 140, 113, 20))
            self.lineEdit.setObjectName("lineEdit")
     
            self.retranslateUi(Form)
            QtCore.QMetaObject.connectSlotsByName(Form)
     
        def retranslateUi(self, Form):
            _translate = QtCore.QCoreApplication.translate
            Form.setWindowTitle(_translate("Form", "Form"))
    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
    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 : 42
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Points : 6 789
    Points
    6 789
    Billets dans le blog
    15
    Par défaut


    Une autre solution pourrait être de passer ton code en QML (si c'est faisable) et ainsi tu pourrais créer tes propres propriétés dans les items de ton choix.
    Par contre je n'ai pas très bien saisi ton besoin (désolé, la soirée a été dur hier )

    Si c'est juste pour s'assurer que le texte rentré soit bien une adresse mail dans le bon format, je suis étonné qu'en Widget il soit nécessaire de passer par une regex. Ça fait longtemps que je n'ai plus codé avec les Widgets mais c'est très étrange.
    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

  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 Jiyuu,

    Citation Envoyé par Jiyuu Voir le message
    Si c'est juste pour s'assurer que le texte rentré soit bien une adresse mail dans le bon format, je suis étonné qu'en Widget il soit nécessaire de passer par une regex. Ça fait longtemps que je n'ai plus codé avec les Widgets mais c'est très étrange.
    Si tu as une solution plus simple pour valider la syntaxe d'une adresse email, elle est la bienvenue!

    Et même avec les regex, c'est très compliqué. Pas tant à cause du système regex lui-même que de la norme qui décrit la syntaxe des adresses email.

    Il faut en effet savoir que cette norme est en même temps stricte et très permissive, beaucoup plus permissive que les adresses email couramment acceptées par les fournisseurs d'accès. Par exemple, l'adresse "!#$%&'*+-/=?^_`.{|}~@example.com" (cf. wikipedia) est syntaxiquement correcte, mais pas "!#$%&'*+-/=?^_`..{|}~@example.com" (les 2 points successifs sont interdits).

    Certains ont essayé de construire un motif regex exhaustif répondant exactement à la norme, mais cela donne une solution déraisonnable (motif regex qui dépasse la demi page).

    Comme dans le cadre de mes activités je vois plusieurs centaines d'adresses emails par an du monde entier, j'ai fait un motif qui permet de déceler les possibles fautes de frappe pendant la saisie. Par exemple, s'il y a une "+" dans l'adresse, je sais que ce n'est pas interdit, mais c'est tellement rare que c'est plus probablement une faute de frappe. Il y a alors une alerte avec un message de type "vous êtes sûr?", ce qui demande à l'utilisateur de vérifier le document d'origine. Cela suffit pour assurer un taux d'erreur de saisie faible, de l'ordre de 1%. Et comme c'est moi qui envoie les emails après en automatique, je suis satisfait qu'il y ait aussi peu de fausses adresses .
    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

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

Discussions similaires

  1. Expression Régulière avec Quote
    Par jon301 dans le forum Langage
    Réponses: 3
    Dernier message: 25/10/2006, 22h08
  2. [RegEx] Expression régulière avec preg_match_all
    Par tit_oune dans le forum Langage
    Réponses: 6
    Dernier message: 18/05/2006, 23h28
  3. Expressions régulières avec variable
    Par killprog dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/04/2006, 17h03
  4. Expression réguliére avec CHECK
    Par BRAUKRIS dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/09/2005, 17h38
  5. Expression régulière avec "|"
    Par YanK dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/07/2005, 15h09

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