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 :

Quelques questions sur les signaux et les slots


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 4
    Par défaut Quelques questions sur les signaux et les slots
    Bonjour bonjour,

    Voila je m'autoforme a PyQt, et j'ai quelques questions dont ej n'ai aps vraiment trouvé de réponse claires sur le net.

    je voudrais tout simplement faire une ouverture de fichier.

    Je défini donc une class mafenetre.
    dans cette fenêtre je mets un pushbutton "parcourir" qui lorsqu'il est cliqué, ouvre une nouvelle fenêtre qui est un QFileDialog().

    Au niveau du connect j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QObject.connect(self.parcourir, SIGNAL("clicked()"), self.ouvrirnavig)
    ouvrirnavig lance donc le QFiledialog.

    sauf que je veux récupérer le chemin du fichier ouvert.
    Donc a l'heure actuelle pour ca, je passe par une variable globale, mais ca me plait pas trop...

    Et surtout le problème c'est que je voudrais lancer quelque chose derrière ce connect, mais une fois que le fichier est sélectionné.

    Donc j'essaye de capter le signal envoyé par QFileDialog : FileSelected.
    Sauf que ca marche pas, cette connection est à True meme si je n'ai pas encore clické sur le bouton parcourir...

    Mon code dans l'etat actuel (j'ai essayé avec accepted ou FileSelected, ca revient au meme.) :
    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
     
    class maFenetre(QWidget):
        global chemin_fichier
        chemin_fichier=""
        def __init__(self):
            super(maFenetre,self).__init__()
            global chemin_fichier
            chemin_fichier=""
            self.resize(300,300)
            self.objet = QFileDialog()
            txt = QLabel("Bonjour \nSelectionnez la manip a lancer :",self)
            self.parcourir = QPushButton("Parcourir",self)
            self.parcourir.move(150,150)
            self.run()
     
        def run(self):
            test = False
            QObject.connect(self.parcourir, SIGNAL("clicked()"), self.ouvrirnavig)
            test = QObject.connect(self.objet, SIGNAL("accepted()"), self.rien)
            print test
     
        def ouvrirnavig(self):
            global chemin_fichier
            self.objet.setWindowFlags(Qt.WindowSystemMenuHint)
            chemin_fichier = str(self.objet.getOpenFileName(QWidget(), QString(), QString("/home/Work/tscope"), QString("*.c")))       
            print "ouvrir :" + chemin_fichier
     
        def rien(self):
            print "on passe dans rien"
    En sorti j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    True
    ouvrir :blablabla
    donc le signal accepted est bien capté, mais par contre ca lance pas "rien"
    Donc la question est pourquoi je capte le accepted avant d'avoir choisi mon fichier et comment faire pour que le programme attende ce signal pour continuer ? (autrement que par un while signal pas recu ) :

    Au passage si vous voyez des aberrations au niveau de l'utilisation des self, je suis preneur de conseils aussi.

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Il est impossible que quoi que ce soit dans ce code puisse fonctionner.

    Ce serait un mauvais service que de te le réécrire.

    Ici tu trouveras plein de petits codes simples qui te permettront de débuter avec Qt en prenant dès le début de bonnes habitudes :

    http://diotavelli.net/PyQtWiki/SampleCode

    Sincèrement.

  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 : 43
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Billets dans le blog
    15
    Par défaut
    Je ne sais pas si tu as réussi à t'en sortir mais voici quelques pistes:

    http://qt.developpez.com/doc/latest/...g.html#signals

    http://qt.developpez.com/doc/latest/...#selectedFiles

    De plus pour ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    global chemin_fichier
    chemin_fichier=""
    ne crois tu pas qu'il y a une façon plus simple de déclarer une chaine (ou out autre objet) comme globale?
    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 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,

    Pour autant que j'ai compris le but, voilà en gros comment je programmerais cela:

    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
     
    #! /usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # Python v2.7
     
    import sys
    from PyQt4 import QtCore, QtGui
     
    #############################################################################
    class maFenetre(QtGui.QWidget):
     
        #========================================================================
        def __init__(self):
            super(maFenetre,self).__init__()
            self.chemin_fichier=""
            self.resize(300,300)
            txt = QtGui.QLabel("Bonjour \nSelectionnez la manip a lancer :",self)
            self.parcourir = QtGui.QPushButton("Parcourir",self)
            self.parcourir.move(150,150)
            self.parcourir.clicked.connect(self.ouvrirnavig)
     
        #========================================================================
        def ouvrirnavig(self):
            self.objet = QtGui.QFileDialog()
            self.objet.setWindowFlags(QtCore.Qt.WindowSystemMenuHint)
            self.chemin_fichier = str(self.objet.getOpenFileName(self,
                            QtCore.QString("Ouvrir un fichier"),
                            QtCore.QString("/home/Work/tscope"),
                            QtCore.QString("*.c")))
            if self.chemin_fichier=="":
                # aucun fichier disponible
                return None
            print "ouvrir :" + self.chemin_fichier
            self.rien()
     
        #========================================================================
        def rien(self):
            print "on passe dans rien"
     
    #############################################################################
    if __name__ == "__main__":
     
        app = QtGui.QApplication(sys.argv)
        fen = maFenetre()
        fen.show()
        sys.exit(app.exec_())
    Je ne vois aucune raison d'avoir une variable globale ici.

    Tyrtamos

    Edit: remplacement de chemin_fichier par self.chemin_fichier au cas où on en aurait besoin dans d'autres méthodes de la classe.

  5. #5
    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 : 43
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Billets dans le blog
    15
    Par défaut
    Juste pour mon information personnelle, ça fait quoi ça?

    Citation Envoyé par tyrtamos Voir le message
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    from __future__ import division
    Citation Envoyé par tyrtamos Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.parcourir.clicked.connect(self.ouvrirnavig)
    Pas sûr que ça soit valable avec PyQt ça. Plutôt PySide non?

    Par contre moi j'ai compris qu'il voulait récupérer le chemin du fichier sélectionné via le QFileDialog.
    Pourquoi ne pas tout simplement utiliser la méthode selectedFiles()?
    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

  6. #6
    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 Jiyuu,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from __future__ import division
    Historiquement chez Python < v3.0, la division entre 2 entiers est un entier, ce qui est inhabituel (3/2=1). Avec cette ligne, ça redevient 'normal' (3/2=1.5). Et on peut toujours disposer d'une division entière avec '//'. Je crois que c'est fini avec Python v3.x.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.parcourir.clicked.connect(self.ouvrirnavig)
    Pas sûr que ça soit valable avec PyQt ça. Plutôt PySide non?
    Non, c'est comme ça que je fais avec PyQt4.

    Par contre moi j'ai compris qu'il voulait récupérer le chemin du fichier sélectionné via le QFileDialog.
    Pourquoi ne pas tout simplement utiliser la méthode selectedFiles()?
    Je ne sais pas: donne ta solution avec selectedFiles qu'on puisse comparer.

    Tyrtamos

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/06/2015, 21h05
  2. Quelques questions sur les annuaires ldap
    Par rvfranck dans le forum Réseau
    Réponses: 7
    Dernier message: 15/08/2006, 02h41
  3. Quelques questions sur les LOB
    Par Wurlitzer dans le forum Oracle
    Réponses: 2
    Dernier message: 14/06/2006, 17h32
  4. Quelques questions sur les threads
    Par benj63 dans le forum C++Builder
    Réponses: 28
    Dernier message: 21/11/2005, 13h27

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