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 :

QDoubleSpinBox, connexion de signaux et de slots [QtGui]


Sujet :

PyQt Python

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 0
    Points
    0
    Par défaut QDoubleSpinBox, connexion de signaux et de slots
    Bonjour à tous,
    je suis totalement débutant en PyQt et je suis face à un problème que je ne sais pas résoudre.

    J'essai d’écrire une petite application. Ce que cette petite application cherche à faire c'est de convertir une charge en femto coulomb vers electron et finalement en electron volt... Application avec peu d’intérêt mais qui est un prétexte pour apprendre. Pour ca j'utilise 4 QDoubleSpinBox connectée entre elles. Le schémas de connection est le suivant :



    (version *.pdf)


    Le code que j'ai déja écrit est le suivant :
    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
     
    #!/usr/bin/env python
     
    import sys
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
     
     
    class Form(QDialog):
        def __init__(self,parent=None):
            super(Form, self).__init__(parent)
            # femto coulomb charge
            self.chargefc = QDoubleSpinBox()
            self.chargefc.setSingleStep(0.01)
            self.chargefc.setRange(1e-4, 1e10)
            self.chargefc.setValue(1)
            self.chargefclabel = QLabel("Charge [fC]")
            self.chargefc.setSuffix(" fC")
     
     
            # electron charge
            self.chargeelectron = QDoubleSpinBox()
            self.chargeelectronlabel = QLabel("Charge [e]")
            self.chargeelectron.setSuffix(" e")
            self.chargeelectron.setRange(1e-4, 1e10)
            self.chargeelectron.setValue(float(1e-15/1.602e-19))
     
            # yield
            self.work = QDoubleSpinBox()
            self.work.setSingleStep(0.1)
            self.worklabel = QLabel("Yield")
            self.work.setValue(15.6)
     
     
            # electron charge
            self.chargeelectronvolt = QDoubleSpinBox()
            self.chargeelectronvoltlabel = QLabel("Charge [eV]")
            self.chargeelectronvolt.setRange(1e-4, 1e10)
            self.chargeelectronvolt.setSuffix(" eV")
            self.chargeelectronvolt.setValue(float(1e-15/1.602e-19)*15.6)
     
     
            # layout
            layout = QGridLayout()
            layout.addWidget(self.chargefc, 0, 1)
            layout.addWidget(self.chargefclabel, 0, 0)
            layout.addWidget(self.chargeelectron, 1, 1)
            layout.addWidget(self.chargeelectronlabel,1, 0)
            layout.addWidget(self.work,2, 1)
            layout.addWidget(self.worklabel, 2, 0)
            layout.addWidget(self.chargeelectronvolt, 3, 1)
            layout.addWidget(self.chargeelectronvoltlabel, 3, 0)
     
            self.setLayout(layout)
            self.chargefc.setFocus()
            self.setWindowTitle("fc to eV")
     
     
            # Connections
            self.connect(self.chargefc,SIGNAL("valueChanged(double)"), self.updateUi)
            self.connect(self.chargeelectron,SIGNAL("valueChanged(double)"), self.updateUi)
            self.connect(self.work,SIGNAL("valueChanged(double)"), self.updateUi)
     
     
        def updateUi(self):
            "update user interface"
     
            # get values
            fc = self.chargefc.value()
     
            # derivation
            electron = fc*1e-15/1.602e-19
            ev = electron*self.work.value()
     
            # change values
            self.chargeelectron.setValue(electron)
            self.chargeelectronvolt.setValue(ev)
     
     
    app = QApplication(sys.argv)
    form = Form()
    form.show()
    app.exec_()



    La question que je me pose est la suivante, comment réaliser mon schémas de connection ?
    Dois-je utiliser une ou plusieurs fonctions (updateUiFc, updateUiEl, updateUiEv) ?

    J'ai fait l'essai avec plusieurs fonction mais le problème c'est comme j'utilise des nombres très grands ou très petits, j'ai l'impression que lorsque je modifie une valeur ça crée des mini boucles qui modifie la valeur que je suis en train de taper...

    D'avance je vous remercie pour votre aide.

    Olivier

  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,

    Si tu désire recalculer le résultat lors d'un changement de chargeelectron, il faudra une fonction spécifique puisque le calcul se fait sur base de femtocoulomb ce qui entraine une remise à l'état initial de chargeelectron

    Dans cette nouvelle fonction, il faudra aussi bloquer les signaux de femtocoulomb, sans quoi on revient au même problème.

    quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            self.connect(self.chargeelectron,SIGNAL("valueChanged(double)"), self.change_electron)
     
        def change_electron(self, v):
            print "chargeelectron: ", v  # toujours utile
            fc = v / (1e-15/1.602e-19)  # je te laisse vérifier ça
            self.chargefc.blockSignals(True)
            self.chargefc.setValue(fc)
            self.chargefc.blockSignals(False)
            ev = v *  self.work.value()
            self.chargeelectronvolt.setValue(ev)

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 0
    Points
    0
    Par défaut
    Bonjour,
    alors trois possibilités:
    1. tu es insomniaque;
    2. tu es très matinal;
    3. tu n'habites pas en France.


    Dans tous les cas, merci de ta réponse...

    J'ai écouté ton conseil et j'ai écrit la chose suivante :
    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
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
     
    #!/usr/bin/env python
     
    import sys
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
     
     
    class Form(QDialog):
     
     
     
        def __init__(self,parent=None):
            self.e = 1.60217646e-19
            super(Form, self).__init__(parent)
            # femto coulomb charge
            self.chargefc = QDoubleSpinBox()
            self.chargefc.setSingleStep(0.01)
            self.chargefc.setRange(1e-4, 1e10)
            self.chargefc.setValue(1)
            self.chargefclabel = QLabel("Charge [fC]")
            self.chargefc.setSuffix(" fC")
     
     
            # electron charge
            self.chargeelectron = QDoubleSpinBox()
            self.chargeelectronlabel = QLabel("Charge [e]")
            self.chargeelectron.setSuffix(" e")
            self.chargeelectron.setRange(1e-4, 1e10)
            self.chargeelectron.setValue(float(1e-15/self.e))
     
            # yield
            self.work = QDoubleSpinBox()
            self.work.setSingleStep(0.1)
            self.worklabel = QLabel("Yield")
            self.work.setValue(15.6)
     
     
            # electron charge
            self.chargeelectronvolt = QDoubleSpinBox()
            self.chargeelectronvoltlabel = QLabel("Charge [eV]")
            self.chargeelectronvolt.setRange(1e-4, 1e10)
            self.chargeelectronvolt.setSuffix(" eV")
            self.chargeelectronvolt.setValue(float(1e-15/self.e)*15.6)
     
     
            # layout
            layout = QGridLayout()
            layout.addWidget(self.chargefc, 0, 1)
            layout.addWidget(self.chargefclabel, 0, 0)
            layout.addWidget(self.chargeelectron, 1, 1)
            layout.addWidget(self.chargeelectronlabel,1, 0)
            layout.addWidget(self.work,2, 1)
            layout.addWidget(self.worklabel, 2, 0)
            layout.addWidget(self.chargeelectronvolt, 3, 1)
            layout.addWidget(self.chargeelectronvoltlabel, 3, 0)
     
            self.setLayout(layout)
            self.chargefc.setFocus()
            self.setWindowTitle("fc to eV")
     
     
            # Connections
            self.connect(self.chargefc,SIGNAL("valueChanged(double)"), self.updateUi_fc)
            self.connect(self.chargeelectron,SIGNAL("valueChanged(double)"), self.updateUi_el)
            self.connect(self.chargeelectronvolt,SIGNAL("valueChanged(double)"), self.updateUi_ev)
            self.connect(self.work,SIGNAL("valueChanged(double)"), self.updateUi_w)
     
     
     
        def updateUi_fc(self):
            "update user interface"
     
            # get values
            fc = self.chargefc.value()
     
     
            # derivation
            electron = fc*1e-15/self.e
            ev = electron*self.work.value()
     
            # block signals
            self.chargeelectron.blockSignals(True)
            self.chargeelectronvolt.blockSignals(True)
     
            # change values
            self.chargeelectron.setValue(electron)
            self.chargeelectronvolt.setValue(ev)
     
            # unBlock signals
            self.chargeelectron.blockSignals(False)
            self.chargeelectronvolt.blockSignals(False)
     
     
        def updateUi_el(self):
            "update user interface"
     
            # get values
            el = self.chargeelectron.value()
     
     
            # derivation
            fc = (el/1e-15)*self.e
            ev = el*self.work.value()
     
            # block signals
            self.chargefc.blockSignals(True)
            self.chargeelectronvolt.blockSignals(True)
     
            # change values
            self.chargefc.setValue(fc)
            self.chargeelectronvolt.setValue(ev)
     
            # unBlock signals
            self.chargefc.blockSignals(False)
            self.chargeelectronvolt.blockSignals(False)
     
        def updateUi_ev(self):
            "update user interface"
     
            # get values
            ev = self.chargeelectronvolt.value()
     
     
            # derivation
            el = ev/self.work.value()
            fc = (el/1e-15)*self.e
     
            # block signals
            self.chargefc.blockSignals(True)
            self.chargeelectron.blockSignals(True)
     
            # change values
            self.chargefc.setValue(fc)
            self.chargeelectron.setValue(el)
     
            # unBlock signals
            self.chargefc.blockSignals(False)
            self.chargeelectron.blockSignals(False)
     
     
        def updateUi_w(self):
            "update user interface"
     
            # derivation
            ev = self.chargeelectron.value() * self.work.value()
     
            # block signals
            self.chargeelectronvolt.blockSignals(True)
     
            # change values
            self.chargeelectronvolt.setValue(ev)
     
            # unBlock signals
            self.chargeelectronvolt.blockSignals(False)
     
    app = QApplication(sys.argv)
    form = Form()
    form.show()
    app.exec_()
    Ça fait ce que ca doit faire... Mais je reste un peu sur ma faim et je me demande si au final, les updateUi_xx ne pourrait pas être contenues dans une seule fonction...

    Je débute alors je ne sais pas si je me pose les bonnes questions... J'explore un peu toutes les possibilités et je choisirai la meilleure...

    En tout cas, je "kiffe" grave le PyQt..

    Merci

    Olivier

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

Discussions similaires

  1. [QThread] Connexion par signaux et slots avec QTcpSocket
    Par johann74270 dans le forum Multithreading
    Réponses: 1
    Dernier message: 28/12/2014, 15h38
  2. Réponses: 12
    Dernier message: 18/09/2012, 11h45
  3. [QtCore] Quelques questions sur les signaux et les slots
    Par simastion dans le forum PyQt
    Réponses: 13
    Dernier message: 09/01/2011, 15h20
  4. [QtCore] Problème de signaux et de slots
    Par benbannock dans le forum PyQt
    Réponses: 1
    Dernier message: 31/07/2010, 12h42
  5. Problème de signaux et de slots
    Par prince_bouja dans le forum Qt
    Réponses: 8
    Dernier message: 15/07/2010, 17h33

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