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

  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

  7. #7
    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


    Citation Envoyé par tyrtamos Voir le message
    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.
    Ahh ben il est jamais trop tard pour apprendre les bases ^^. Je me souviens pas du tout de ceci ^^.

    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?
    Non, c'est comme ça que je fais avec PyQt4.
    À la lecture de http://developer.qt.nokia.com/wiki/S...lots_in_PySide je pensais que PyQt4 n'acceptait pas cette syntaxe. Erreur de ma part alors.

    Citation Envoyé par tyrtamos Voir le message
    Je ne sais pas: donne ta solution avec selectedFiles qu'on puisse comparer.

    Tyrtamos
    Pour récupérer le chemin d'un fichier sélectionné j'aurai fait ainsi.
    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
    # -*- coding: iso-8859-1 -*-
     
    import sys
    from PySide import QtGui, QtCore
     
    class Frame(QtGui.QWidget):
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
            self.resize(300,300)
            txt = QtGui.QLabel("Bonjour \nSelectionnez la manip a lancer :",self)
            self.parcourir = QtGui.QPushButton("Parcourir",self)
            self.parcourir.clicked.connect(self.ouvrirnavig)
            self.parcourir.move(150,150)
     
        def ouvrirnavig(self):
            self.objet = QtGui.QFileDialog(self)
            self.objet.show()
     
            self.objet.fileSelected.connect(self.test)
     
        def test(self):
            print self.objet.selectedFiles()
     
     
     
    app = QtGui.QApplication(sys.argv)
    frame = Frame()
    frame.show()
    sys.exit(app.exec_())
    Au passage quel est l'intérêt et/ou l'avantage de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Window(QtGui.QWidget):
        def __init__(self, parent=None):
            super(QtGui.QWidget, self).__init__(parent)
    plutôt que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Window(QtGui.QWidget):
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
    ???
    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

  8. #8
    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,

    Merci pour la solution avec "selectedFiles".

    Pour ce qui concerne la ligne 'connect': je n'utilise cette forme qu'avec les boutons (QPushButton) et l'autre méthode avec SIGNAL dans tous les autres cas.

    Pour la différence entre les 2 lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    super(QtGui.QWidget, self).__init__(parent)
    QtGui.QWidget.__init__(self, parent)
    Je ne sais pas. Le plus "normal" est la 2ème ligne, mais il y a tellement d'exemples avec la 1ère ligne que je l'ai adoptée. Y compris dans l'excellent bouquin "Rapid GUI Programming with Python and Qt" de Mark Summerfield (http://www.qtrac.eu/pyqtbook.html) que je me suis payé, et que je te recommande (malheureusement en anglais). Comme il est cité par riverbank computing, je le considère comme une référence pour PyQt4.

    Pour PySide: je développe une application qui doit absolument fonctionner, et je ne peux pas, de ce fait, utiliser PySide qui est trop jeune et en version beta. Mais je regarde son évolution avec intérêt.

    Tyrtamos

  9. #9
    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
    Hello Tyrtamos,

    Citation Envoyé par tyrtamos Voir le message
    Y compris dans l'excellent bouquin "Rapid GUI Programming with Python and Qt" de Mark Summerfield (http://www.qtrac.eu/pyqtbook.html)
    Citation Envoyé par tyrtamos Voir le message
    C'est bientôt mon anniversaire et je crois que je vais m'offrir un petit cadeau ^^
    Pour PySide: je développe une application qui doit absolument fonctionner, et je ne peux pas, de ce fait, utiliser PySide qui est trop jeune et en version beta. Mais je regarde son évolution avec intérêt.
    Tyrtamos
    Oui je te comprends. Moi je débute dans Qt pour Python donc je me suis tourné directement vers PySide.
    Même si la beta 1 est tout de même bien aboutie certains bogues sont assez contraignants et malheureusement je ne parviens pas à compiler cette foutue beta 3 ^^.

    Le gros avantage pour toi, c'est qu'une fois PySide 1.0.0 sortie en version finale (normalement d'ici 4 semaines environ), tu pourras facilement migrer vers(et donc bénéficier de la LGPL) puisqu'il n'y principalement que les import qui changent (plus quelques petites subtilité mais à priori rien d'insurmontable).
    Par contre cela suppose rester en Python 2.X pour le moment...

    (Je crois que l'on sort un peu du sujet là ^^)
    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

  10. #10
    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
    Citation Envoyé par tyrtamos Voir le message

    Pour la différence entre les 2 lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    super(QtGui.QWidget, self).__init__(parent)
    QtGui.QWidget.__init__(self, parent)
    Je ne sais pas. Le plus "normal" est la 2ème ligne, mais il y a tellement d'exemples avec la 1ère ligne que je l'ai adoptée.
    ...

    Tyrtamos
    ... qui, en l'occurence, aurait plutôt dut être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class Window(QtGui.QWidget):
        def __init__(self, parent=None):
            super(Window, self).__init__(self, parent)
    Et, puisque tu parles de M. Summerfielfd,

    http://www.mail-archive.com/pyqt@riv.../msg21512.html

  11. #11
    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
    Citation Envoyé par VinsS Voir le message
    ... qui, en l'occurence, aurait plutôt dut être...
    Oui, effectivement. Je m'étais contenté de recopier la ligne, et j'aurais dû la corriger.

    Merci.

    Tyrtamos

  12. #12
    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
    Mais les deux fonctionnent non?
    Quel est l'avantage de l'une par rapport à l'autre?
    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

  13. #13
    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,

    Citation Envoyé par Jiyuu Voir le message
    Mais les deux fonctionnent non?
    Quel est l'avantage de l'une par rapport à l'autre?
    La ligne sans 'super' utilise bien la classe parente.

    Mais pas la ligne avec 'super', qui utilise le nom de la classe qu'on est en train de créer. C'est conforme aux exemples du livre de Summerfielfd.

    Les 2 solutions ont l'air de fonctionner, mais comme une bibliothèque graphique est tout de même très compliquée, je ne sais pas si ça marche dans tous les cas. D'où mon choix.

    Tyrtamos

  14. #14
    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
    Oui j'avais bien noté ces deux différences... sans "super" m'a l'air tout de même plus "traditionnel" ^^
    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

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