Forum Programmation.python probleme avec PyQt4 et les signaux

Posté par  .
Étiquettes : aucune
0
15
oct.
2009

Salut, je commence a tenter la programmation GUI et je me met a PyQT4. J'ai un probleme bete. Mon logiciel fonctionne bien sauf sur un point. J'ai mis un bouton reset et du coup si j'ai un champ a editer et que je clic sur return cela me declanche le signal clicked pour reset. Cela me semble assez bizarre. Est-ce un comportement normal? Si oui comment faire pour faire en sorte de declencher reset uniquemet quand je clic dessus?

Voila un petit programme minimaliste qui montre mon probleme.

Merci d'avance.


import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class Test(QDialog):

def __init__(self, parent=None):
super(Test, self).__init__(parent)
self.toto = 0.3
self.totolabel = QLabel('toto')
self.totoedit = QLineEdit('{0:.2f}'.format(self.toto))
buttonBox = QDialogButtonBox(QDialogButtonBox.Reset)
layout = QGridLayout()
layout.addWidget(self.totolabel,0,0)
layout.addWidget(self.totoedit,0,1)
layout.addWidget(buttonBox, 1, 0, 1, 2)
self.setLayout(layout)
self.connect(self.totoedit, SIGNAL('returnPressed()'), self.returnedit)
self.connect(buttonBox.button(QDialogButtonBox.Reset), SIGNAL("clicked()"), self.resetForm)

def resetForm(self):
print 'button reset clicked'

def returnedit(self):
print 'return pressed in line edit'

app = QApplication(sys.argv)
test = Test()
test.show()
app.exec_()
  • # je programmes pas en python

    Posté par  . Évalué à -1.

    mais quand je lis
    self.connect(buttonBox.button(QDialogButtonBox.Reset), SIGNAL("clicked()"), self.resetForm)

    j'en deduis que ton code envoie le signal 'clicked' quand tu appuies sur le bouton reset

    je me trompe ?
    • [^] # Re: je programmes pas en python

      Posté par  . Évalué à 2.

      arf, j'ai lu de probleme à l'envers...

      quand tu fais entrer, ca te "click" aussi sur le bouton reset, effectivement c'est pas genial
      il faut peut-etre regarder ou se trouve le focus quand tu fais entrer, afin de ne valider que ce sur quoi est posé ton focus

      sinon ca fait peut-etre comme les formulaires PHP,
      tu peux avoir 25 champs, un bouton, le fait de faire "entrer" ca appuie sur le bouton.
      il faut alors faire un bouton valide, un bouton reset
      et mettre le focus par defaut sur valide

      comme ca "entrer" va valider le formulaire
      • [^] # Re: je programmes pas en python

        Posté par  . Évalué à 1.

        je veux pas un truc en php j'ai just fait un "test case" minimal pour montrer mon probleme.

        ps: Au passage je remercie les personnes considerant cette question dans les forums et partie python (pyqt4 c'est du python) comme inutile c'est syper sympa et tres tres utile...
      • [^] # Re: je programmes pas en python

        Posté par  . Évalué à 2.

        Au j'ai oublie le focus ne change rien a l'affaire. car si t'essaye le bout de code debile que j'ai mis si tu tapes dans le line edit tu as donc le focus, tu tapes sur return et la paf cela te dit que cela a bien intercepte le signal a ce endroit la mais ca fait aussi un clic pour le reset.
      • [^] # Re: je programmes pas en python

        Posté par  . Évalué à 2.

        Bon ben finalement tu avais raison semble t'il il y avait bien un probleme de focus. Je comprend pas trop la logique mais bon... Donc voici la solution:
        import sys
        from PyQt4.QtCore import *
        from PyQt4.QtGui import *
        
        class Test(QDialog):
            
            def __init__(self, parent=None):
                super(Test, self).__init__(parent)
        	self.toto = 0.3
        	self.totolabel = QLabel('toto')
        	self.totoedit = QLineEdit('{0:.2f}'.format(self.toto))
        	buttonBox = QDialogButtonBox(QDialogButtonBox.Reset)
        	layout = QGridLayout()
        	layout.addWidget(self.totolabel,0,0)
        	layout.addWidget(self.totoedit,0,1)
        	layout.addWidget(buttonBox, 1, 0, 1, 2)
        	self.setLayout(layout)
        	self.connect(self.totoedit, SIGNAL('returnPressed()'), self.returnedit)
        	self.connect(buttonBox.button(QDialogButtonBox.Reset), SIGNAL("clicked()"), self.resetForm)
        	buttonBox.setFocusPolicy(Qt.NoFocus)
        
            def resetForm(self):
        	print 'button reset clicked'
        
            def returnedit(self):
        	print 'return pressed in line edit'
        
        app = QApplication(sys.argv)
        test = Test()
        test.show()
        app.exec_()
        
        • [^] # explication

          Posté par  . Évalué à 3.

          Explication (trouvée depuis la doc de qdialogbuttonbox) :

          "However, if there is no default button set and to preserve which button is the default button across platforms when using the QPushButton::autoDefault property, the first push button with the accept role is made the default button when the QDialogButtonBox is shown,"

          Puis :
          http://doc.trolltech.com/4.5/qpushbutton.html#default-prop
          "A button with this property set to true (i.e., the dialog's default button,) will automatically be pressed when the user presses enter"
          • [^] # Re: explication

            Posté par  . Évalué à 2.

            Merci beaucoup ceci explique cela et j'avais rate cela dans la doc /o\ desole!

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.