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 :

[QWizard] Personnaliser le slot du bouton Next


Sujet :

PyQt Python

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 62
    Points : 37
    Points
    37
    Par défaut [QWizard] Personnaliser le slot du bouton Next
    Salut

    J'ai un formulaire QWizard qui fonctionne bien, je voudrais avant d'aller sur une page suivante lorsque je clique sur le boutton suivant que son slot par défaut qui consiste à aller sur la page suivante ne s'execute qui si seulement je fini à controler les saisies de l'utilisateur. sinon on reste sur cette page.

    Merci de votre aide

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Salut

    voudrais avant d'aller sur une page suivante lorsque je clique sur le boutton suivant que son slot par défaut qui consiste à aller sur la page suivante
    Sans montrer le code , ça va être difficile d'aider.

    Il s'agit bien du QWizard de PyQt ? Que l'on ne se trompe pas.

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 483
    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 483
    Points : 9 282
    Points
    9 282
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Sur un "QWizardPage", quand un widget de saisie comme un QLineEdit est enregistré avec registerField, il suffit de terminer son nom (1er argument) avec un '*' pour que la saisie soit obligatoire. Et quand elle l'est, le bouton next / finish est désactivé tant que la saisie n'est pas faite.

    Extrait de la doc: "If name ends with an asterisk (*), the field is a mandatory field. When a page has mandatory fields, the Next and/or Finish buttons are enabled only when all mandatory fields are filled"

    Il y a un exemple intéressant fourni avec PyQt qui s'appelle classwizard.py

  4. #4
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 62
    Points : 37
    Points
    37
    Par défaut
    merci bien pour registerField que j'ai bien exploité mais jusqu'ici la fonction registerField contraint juste que le champs obligatoire spécifié par * ne soit vide
    ce qui est une bonne chose mais je voudrais qu'en plus je suis en mesure de vérifier si la données saisie n'est pas un charactère, n'existe pas dans la base des données, doit contenir autant de caractère, est une adresse mail valable...

    J'ai essaye de deconecter le bouton suivant à son slot par defaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject.disconnect(self.button(QWizard.NextButton), SIGNAL('clicked()'), self, SLOT('next()'))
    et à le connecter à un SLOT
    que j'ai codé

    comme ici

    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
    def validatePageD(self):
     
     
             #QtGui.QWizardPage.registerField("txtnomResp*", self.txtnomResp)
     
     
                    try :
                        m=int(self.txtCode.text())
     
                    except ValueError :
                        m=0
                    if m <= 10:
     
     
                         QObject.disconnect(self.button(QWizard.NextButton), SIGNAL('clicked()'), self, SLOT('next()'))
                         QMessageBox.information(self, "jjjj", "DEMOCRATIE")
     
                    elif m > 10:
     
     
                         QObject.connect(self.button(QWizard.NextButton), SIGNAL('clicked()'), self, SLOT('next()'))
                    #   QMessageBox.information(self, "jjjj", "yes")
    le bouton exécute cette fonction et se passe de cellui par defaut mais quand j'essaie de me reconnecter sur ce slot par defaut dans le second if(elif) je n'y arrive pas. y-a il une autre facon de valider mon QWizardPage avant de passer à la page suivante?

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 483
    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 483
    Points : 9 282
    Points
    9 282
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je n'utilise pas QWizrard, mais il me semble que la solution pourrait être de sous-classer QWizardPage, et de surcharger sa méthode isComplete qui doit retourner True ou False. C'est en effet elle qui dit si le bouton suivant/finish doit être ou non activé.

    Voilà un petit code tout simple. Le seul widget de la page est un QLineEdit, mais il pourrait y en avoir d'autres:

    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
    class MonQWizardPage(QtWidgets.QWizardPage):
     
        def __init__(self, parent=None):
            super().__init__(parent)
            self.resize(400, 300)
     
            self.edit = QtWidgets.QLineEdit(self)
            self.registerField("edit*", self.edit) # ne pas oublier le '*' après le nom du champ
     
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.edit, 0, 0)
            self.setLayout(posit)
     
        def isComplete(self):
            """retourne True si le bouton suivant/finish peut être activé 
            """
            if self.edit.text()=="xxx":
                return True and super().isComplete()
            else:
                return False
    Et on lance le QWizard comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            self.wiz = QtWidgets.QWizard()
            self.wizp = MonQWizardPage()
            self.wiz.addPage(self.wizp)
            self.wiz.show()
    Avec cet exemple, le bouton finish n'est activé que si on écrit "xxx" dans le QLineEdit. On peut, bien sûr, mettre n'importe quel autre test!

    Attention: comme je n'utilise pas QWizard, j'ai peut-être oublié des trucs: voir la doc pour compléter!

  6. #6
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 62
    Points : 37
    Points
    37
    Par défaut
    Merci pour ta contribution qui m'a permis de comprendre a quoi sert la fonction isComplete, apres plusieurs recherches j'ai trouvé aussi ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Validator(QtGui.QDoubleValidator):
        def validate(self, value, pos):
            text = value.strip().title()
            for null in ('None', 'Null', 'Nothing'):
                if text == null:
                    return QtGui.QValidator.Acceptable, text, pos
                if null.startswith(text):
                    return QtGui.QValidator.Intermediate, text, pos
            return super(Validator, self).validate(value, pos)
    qui rédefinit la fonction validate et qui permet dans le cas ici de rejeter la saisie des données alphabetique dans un QLineEdit

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 62
    Points : 37
    Points
    37
    Par défaut
    Je reprends cette discussion parcequ'à fin de compte je me rends compte que ce que je voudrais avoir n'est pas exactement

    au fait je réessaie de surcharger une méhode de QWizardPage.isComplete pour me permettre de garder ou non le bouton next et finish désactivé si un certain nombre de conditions ne sont pas complètes mais seulement mes boutons restent toujours actifs. voici un extrait de mon code


    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
    class B(QWizard):
     
        def __init__(self):
     
            QWizard.__init__(self)
     
            self.addPage(self.createIntroPage())
            self.setWindowTitle("Trivial Wizard")
            self.addPage(self.createRegistrationPage())
            self.setWindowTitle("Registration page")
            self.addPage(self.createConclusionPage())
            self.setWindowTitle("Conclusion")
            self.isComplete()
            self.show()
    ....
     
    def isComplete(self):
     
             if self.nameLineEdit =="yyyy":
                return False

    merci

  8. #8
    Membre actif
    Profil pro
    Développeur Back-End
    Inscrit en
    Août 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2003
    Messages : 138
    Points : 265
    Points
    265
    Par défaut
    J'ai eu le même problème et j'ai réussi à le résoudre en appelant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.completeChanged.emit()
    à l'endroit où je veux faire recalculer la méthode isComplete().

    Mais je ne m'y connais pas assez pour te dire exactement comment faire.

    Bon courage,

    Axel

Discussions similaires

  1. [Inno Setup] Bouton 'Next' Enable Property
    Par az0101 dans le forum Outils
    Réponses: 8
    Dernier message: 10/12/2009, 20h42
  2. [Prototype] Lightbox 2, afficher constamment le bouton next et previous
    Par morgan47 dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 18/08/2009, 13h12
  3. Comment changer un bouton "next" en "finish" dans un window form ?
    Par Battosaiii dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/10/2008, 14h11
  4. Désactiver le bouton next
    Par bibifock dans le forum Dreamshield
    Réponses: 2
    Dernier message: 03/03/2008, 10h24
  5. [Struts-Layout] Utilisation des boutons next et previous
    Par elsodiop dans le forum Struts 1
    Réponses: 3
    Dernier message: 13/02/2007, 12h56

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