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 une fenêtre devant ma fenêtre principale [QtGui]


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 97
    Par défaut Afficher une fenêtre devant ma fenêtre principale
    Bonjour,
    Mon probléme est tout béte, mais j'arrive pas à trouver comment faire ...
    Je développe un soft pour un professionnel.
    J'ai une fenetre principal ou il y a toutes les données sur un client sélectionné.
    J'ai un petit bouton qui devrait me permettre de choisir le client.
    Lorsque je clique sur mon bouton, j'ai ma fenetre qui s'ouvre, fenetre que j'ai designer car elle attaque une BD mysql, donc je récupére les nom de mes clients afin un systéme de recherche rapide pour toruver le client ...
    Bref, ma fenetre s'ouvre, mais ne bloque pas l'accés a ma fenetre principale, mais surtout je n'ai pas de moyen de retour simple du client sélectionné.
    Je n'ai pas envie de faire un slot pour.
    J'aimerai avoir le meme systéme de fonctionnement que la fenetre qui permet de cherche un document (fichier -> ouvrir)
    Si vous avez des idées ou des tutos suceptible de m'aider je suis preneur
    Mais aussi, si je ne suis pas assez explicite, n'hésitez pas à me poser des questions
    merci d'avance
    @+
    julien

  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,

    Voilà un petit code qui devrait te donner au moins une façon de faire:

    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
     
    import sys
    from PyQt4 import QtCore, QtGui
    from PyQt4.QtCore import SIGNAL
     
    ###################################################
    class Quelclient(QtGui.QWidget):
     
        def __init__(self, princ, parent=None):
            super(Quelclient, self).__init__(parent)
            self.setWindowTitle(u"Quel client")
     
            # permet d'accéder aux attributs de la fenêtre appelante
            self.princ = princ
     
            # créer un lineEdit
            self.lineEdit = QtGui.QLineEdit(self)
            # créer un bouton
            self.bouton = QtGui.QPushButton(u"Ok", self)
            self.bouton.clicked.connect(self.ok_m)
            # positionner les widgets dans la fenêtre
            posit = QtGui.QGridLayout()
            posit.addWidget(self.lineEdit, 0, 0)
            posit.addWidget(self.bouton, 1, 0)
            self.setLayout(posit)
     
        def ok_m(self):
            # transmettre le nom du client écrit à l'appelant
            self.princ.client = self.lineEdit.text()
            # emettra un signal "fermeturequelclient()" en passant ici
            self.emit(SIGNAL("fermeturequelclient()")) 
            # fermer la fenêtre
            self.close()
     
    ###################################################
    class Principal(QtGui.QMainWindow):
     
        def __init__(self, parent=None):
            super(Principal, self).__init__(parent)
            self.setWindowTitle(u"Code test")
     
            # mettre un fond
            self.setCentralWidget(QtGui.QFrame())
            # créer un lineEdit
            self.lineEdit = QtGui.QLineEdit(self.centralWidget())
            # créer un bouton
            self.bouton = QtGui.QPushButton(u"Sélectionnez un client !", self.centralWidget())
            self.bouton.clicked.connect(self.quelclient_m)
            # positionner les widgets sur le fond de la fenêtre
            posit = QtGui.QGridLayout()
            posit.addWidget(self.lineEdit, 0, 0)
            posit.addWidget(self.bouton, 1, 0)
            self.centralWidget().setLayout(posit)
     
        def quelclient_m(self):
            self.client = None
            self.quelclient = Quelclient(self)
            # en cas de signal "fermeturequelclient()" reçu de self.quelclient => exécute clienchoisi 
            self.connect(self.quelclient, SIGNAL("fermeturequelclient()"), self.clientchoisi) 
            # appel de la 2ème fenêtre
            self.quelclient.setWindowModality(QtCore.Qt.ApplicationModal)
            self.quelclient.show()
     
        def clientchoisi(self):
            if self.client != None:
                self.lineEdit.setText(self.client)
     
    ###################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('plastique'))
        main = Principal()
        main.show()
        sys.exit(app.exec_())
    Comme tu vois, il y a une fenêtre principale qui s'appelle... Principale.

    En appuyant sur son bouton, elle appelle une seconde fenêtre self.quelclient pour sélectionner un client. Pour rendre cette fenêtre "modale", il suffit d'ajouter avant le 'show()' la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.quelclient.setWindowModality(QtCore.Qt.ApplicationModal)
    Une fois la 2ème fenêtre appelée, on peut taper un nom dans sa ligne de saisie et appuyer sur son bouton 'ok' qui ferme la fenêtre et qui rend la main à la 1ère fenêtre.

    Lorsque la 2ème fenêtre est fermée, la ligne d'édition de la 1ère fenêtre porte le nom du client sélectionné par la 2ème fenêtre.

    Pour assurer la transmission du nom du client à la fenêtre principale, il y a 2 pb à résoudre:

    1- pour que l'on puisse à partir de la 2ème fenetre transmettre dans un attribut de la 1ère le nom du client, il faut transmettre le self de la 1ère fenêtre à la seconde: self.quelclient = Quelclient(self). Ce self sera dans l'argument 'princ', puis dans self.princ. Ainsi, la ligne self.princ.client = self.lineEdit.text() affectera directement le nom du client dans l'attribut self.client de la 1ère fenêtre.

    2- Il faut qu'il se passe quelque chose dans la 1ère fenêtre quand la 2ème fenêtre ferme! Pour cela, on peut créer un signal avec emit lors de la fermeture de la 2ème fenêtre, et préparer avec connect la 1ère fenêtre à le recevoir et à lancer la méthode clientchoisi() qui affiche le nom du client dans la 1ère fenêtre!

    Ok?

    Tyrtamos

  3. #3
    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
    Petite variante par rapport à ma solution précédente.

    On peut transmettre le nom du client en le passant avec le signal comme argument:

    - le emit devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.emit(SIGNAL("fermeturequelclient(PyQt_PyObject)"), unicode(self.lineEdit.text()))
    - le connect devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.connect(self.quelclient, SIGNAL("fermeturequelclient(PyQt_PyObject)"), self.clientchoisi)
    - et la méthode self.clientchoisi devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def clientchoisi(self, x):
        self.lineEdit.setText(x)
    De ce fait, on n'a plus besoin de transmettre le self à l'appel de la 2ème fenêtre. On n'a plus besoin non plus de self.client ni de self.princ.

    A noter qu'on peut transmettre comme cela avec le signal n'importe quel objet Python (liste, dict, ...).

    Tyrtamos

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 97
    Par défaut
    Merci beaucoup !!!
    J'ai pris la premiére solution, et ca marche super bien !!!
    Un grand merci !!!

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

Discussions similaires

  1. [Débutant] Afficher une image dans ma fenêtre
    Par phanie50 dans le forum C#
    Réponses: 16
    Dernier message: 09/06/2015, 10h36
  2. Afficher une Image devant un GLSceneViewer
    Par Wx234 dans le forum Débuter
    Réponses: 3
    Dernier message: 26/08/2013, 18h18
  3. Réponses: 1
    Dernier message: 22/07/2008, 15h33
  4. Afficher une texture sur la fenêtre en tailel réelle
    Par Matthieu Brucher dans le forum OpenGL
    Réponses: 17
    Dernier message: 02/07/2008, 12h22
  5. Afficher une image devant un composant ?
    Par gazier20 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 11/03/2006, 14h45

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