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 :

Gestion de login avec differents interfaces graphiques de differents groupes d'utilisateurs [QtGui]


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 39
    Billets dans le blog
    1
    Par défaut Gestion de login avec differents interfaces graphiques de differents groupes d'utilisateurs
    Bonsoir;
    Je viens ici pour demander la faisabilité de se logguer avec une fenetre principale et ensuite pour chaque groupe d'utilisateur ouvrir une fenetre correspondante tout en detruisant la fenetre de logging et pouvoir l'invoquer après un certain temps d'inactivité. Merci.

    NB: J'ai essayé en suivant les astuces donné ici mais dès que je detruis la fenetre de logging tout disparait.

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne suis pas sûr de comprendre le problème.

    Mais au cas où, essaie d'ajouter cette instruction au lancement (après app = QApplication(sys.argv)):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    app.setQuitOnLastWindowClosed(False)
    Explication: par défaut, le programme s'arrête après la fermeture (.close()) de la dernière fenêtre sans parent. L'instruction proposée désactive cette fonction. A noter que c'est une bonne pratique de donner un parent à chaque fenêtre secondaire: vérifie que c'est ce que tu fais.

    Autre solution: au lieu de fermer une fenêtre (.close()), on peut se contenter de la cacher (.hide()), ce qui permet de la faire réapparaître plus tard si nécessaire (.show()).

    Si ça ne suffit pas, il vaudrait mieux mettre un petit code de test qui montre le problème à résoudre. Tu peux t'inspirer du code que j'avais donné dans le fil dont tu donnes le lien.

  3. #3
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 39
    Billets dans le blog
    1
    Par défaut
    Bonsoir;
    Merci pour l'aide, j'ai essayé et jusqu'à présent, je ne suis pas satisfait. Voici où j'en suis :
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    #!/usr/bin/env python
     
    import os
    import sys
     
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    from PyQt4.QtSql import *
     
    import dbModel
    import accueilA
    import accueilB
    import accueilC
     
     
    class Login(QDialog):
     
     
        def __init__(self, parent=None):
            super(Login, self).__init__(parent)
            self.setWindowTitle(u"Connexion ....")
     
            self.edtUsername = QLineEdit(self)
            self.edtUsername.setText(u"identifiant?")
            self.edtUsername.returnPressed.connect(self.close)
     
            self.edtPassword = QLineEdit(self)
            self.edtPassword.setText(u"mot de passe?")
            self.edtPassword.setEchoMode(QLineEdit.Password) # ne pas afficher le mot de passe
            self.edtPassword.returnPressed.connect(self.close)
     
            self.btnConnexion = QPushButton('Connexion', self)
            self.btnConnexion.clicked.connect(self.close)
     
            layout = QFormLayout()
     
            layout.addRow("Nom d'utilisateur : ",self.edtUsername)
            layout.addRow("Mot de passe : ", self.edtPassword)
            btnAnnuler = QPushButton("Annuler")
            btnAnnuler.clicked.connect(self.close)
            l = QHBoxLayout()
            l.addStretch()
            l.addWidget(self.btnConnexion)
            l.addWidget(btnAnnuler)
            layout.addRow(l)
            self.setLayout(layout)
     
            self.edtUsername.setFocus()
            self.edtUsername.selectAll()
     
        def closeEvent(self, event):
     
            user = self.edtUsername.text()
            passe = self.edtPassword.text()
            print("Username : %s et le password : %s "%(user,passe))
     
            self.cv = dbModel.isElementOf(user,passe)
            if self.cv == 1 :
                ecran = accueilA.MainWindow()
                ecran.show()
            elif self.cv == 2:
                ecran = accueilB.MainWindow()
                ecran.show()
            elif self.cv == 3:
                ecran = accueilC.MainWindow()
                ecran.show()
            else:
                QMessageBox.critical(self, "Database Connection",
                "Database Error: Nom d'utilisateur ou mot de passe incorrect!")
            # acceptation de la fermeture de la fenêtre
            event.accept()
     
     
    def main():
     
        app = QApplication(sys.argv)
        app.setQuitOnLastWindowClosed(False)
     
     
        print("Connecting to database...")
        db = QSqlDatabase.addDatabase("QPSQL")
        db.setHostName("localhost")
        db.setDatabaseName("MABASE")
        db.setUserName("name")
        db.setPassword("*****")
    #    
        ok = db.open()
     
        if ok:
            print("About to handle database stuff")
            app.processEvents()
            #dbModel.createDBTables()
        else:
            QMessageBox.warning(None, "Database Connection",
                QString("Database Error: %1").arg(db.lastError().text()))
            sys.exit(1)
            print("Database not handle")
        cnx = Login()
        cnx.exec_()
        sys.exit(app.exec_())
     
    main()
    Les accueilX sont des modules contenant les QMainWindow. Je veux détruire le dialog Login seulement si l'identification passe. Je veux aussi pouvoir l'invoquer depuis les differents QMainWindow après 15mn d'inactivité. Merci

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

    Désolé pour le délai de réponse, mais avec un code de 100 lignes qu'on ne peut pas exécuter à cause des importations, ce n'est pas facile...

    Dans la fenêtre Login, dès qu'on met un peu partout ".connect(self.close)", on engage la fermeture de la fenêtre, en arrivant à la dernière étape qui est "closeEvent". A noter qu'on arrivera aussi dans closeEvent en cliquant sur la croix de la fenêtre. La seule manière d'éviter la fermeture de la fenêtre dans closeEvent est de la refuser avec "event.ignore()". Mais si on passe par "event.accept(), c'est fini, et je ne vois pas comment la faire réapparaître après 15mn d'inactivité.

    Conclusion: comme je le suggérais, il faut utiliser hide et non close. Il faut diriger les 3 .connect(...) (=les 2 QLineEdit et le bouton) vers un méthode à créer "fin" par exemple.

    Après, on peut dans cette méthode "fin" fermer la fenêtre avec self.close(), ou la cacher provisoirement avec self.hide() pour la faire réapparaître plus tard avec self.show().

    Je suggère un petit coup d'œil dans la notice sur hide (c'est la notice de PyQt5, je n'ai plus celle de PyQt4):

    Hides the widget. This function is equivalent to setVisible(false).

    Note: If you are working with QDialog or its subclasses and you invoke the show() function after this function, the dialog will be displayed in its original position.

    See also hideEvent(), isHidden(), show(), setVisible(), isVisible(), and close().
    A noter qu'on peut à tout moment tester pour savoir si la fenêtre est visible ou pas.

    Pour que le ré-affichage de la fenêtre de login puisse être fait à partir des QMainWindows, il faut bien sûr que sa variable d'instance cnx soit accessible à l'intérieur de ces QMainWindow, ce que la seule importation ne permettra pas!

    J'en profite pour signaler que la solution des importations "attrape-tout" avec une étoile n'est vraiment pas conseillée.

  5. #5
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 39
    Billets dans le blog
    1
    Par défaut
    Merci pour la réponse et le temps que vous m'avez consacré. Je vais en abuser en demandant ce que je dois faire de façon optimale pour atteindre mes objectifs en omettant le retour à l'écran de connection. Merci

  6. #6
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 39
    Billets dans le blog
    1
    Par défaut
    J'y suis presque. En suivant l'astuce donné dans le billé que j'ai cité en premier et avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    app.setQuitOnLastWindowClosed(False)
    et avec hide, j'arrive à faire ce que je veux mais le petit hic, c'est lorsque je ferme la fenêtre principale, l'application ne se termine pas; que dois-je faire dans ce cas pour terminer l'application? Merci

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

Discussions similaires

  1. Application avec multiples interfaces graphiques
    Par Boobatt dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 08/04/2007, 17h25
  2. Réponses: 4
    Dernier message: 30/03/2007, 16h27
  3. [XUBUNTU] Problème avec l'interface graphique de vnc
    Par sniperwolf79 dans le forum Ubuntu
    Réponses: 1
    Dernier message: 08/02/2007, 14h40
  4. probleme avec une interface graphique
    Par jibb2b dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 10/01/2007, 13h52
  5. Application avec plusieurs interfaces graphiques
    Par Morpheus2144 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 25/05/2006, 23h29

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