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 :

Interférence de signal entre QLineEdit et QPushButton [QtGui]


Sujet :

PyQt Python

  1. #1
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut Interférence de signal entre QLineEdit et QPushButton
    Bonjour,

    Je constate un problème avec le signal editingFinished émit par une QLineEdit.

    Selon la doc, le signal est émit lorsque la ligneEdit perd le focus ET lors d'une pression des touches Return et Enter

    Dans l'exemple ci-dessous, on a un QPushButton destiné à rafraichir le contenu d'une comboBox et, dessous une ligneEdit.

    A chaque fois que le signal editingFinished est émit le bouton émet aussi un signal clicked.

    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
     
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from PyQt4 import QtCore, QtGui
     
    class Ui_Dialog(object):
        def setupUi(self, Dialog):
            Dialog.resize(196, 87)
            self.gridLayout = QtGui.QGridLayout(Dialog)
            self.verticalLayout = QtGui.QVBoxLayout()
            self.horizontalLayout = QtGui.QHBoxLayout()
            self.comboBox = QtGui.QComboBox(Dialog)
            self.comboBox.addItems(["Alpha", "Beta", "Gamma"])
            self.horizontalLayout.addWidget(self.comboBox)
            self.pushButton = QtGui.QPushButton(Dialog)
            self.pushButton.setMaximumSize(QtCore.QSize(25, 25))
            self.pushButton.setText("R")
            self.horizontalLayout.addWidget(self.pushButton)
            self.verticalLayout.addLayout(self.horizontalLayout)
            self.lineEdit = QtGui.QLineEdit(Dialog)
            self.verticalLayout.addWidget(self.lineEdit)
            self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
            self.pushButton.clicked.connect(self.on_button_clicked)
            self.lineEdit.editingFinished.connect(self.on_line_edited)
            Dialog.show()
            QtCore.QCoreApplication.processEvents()
            print ("Running, button has focus: ", self.pushButton.hasFocus())
     
        def on_button_clicked(self):
            print ("Refresh clicked. Button has focus: ", self.pushButton.hasFocus())
     
        def on_line_edited(self):
            print ("Editing line finished. Line has focus: ", self.lineEdit.hasFocus())
     
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        Dialog = QtGui.QDialog()
        ui = Ui_Dialog()
        ui.setupUi(Dialog)
        sys.exit(app.exec_())
    Remarques:
    Avec un QToolButton cela ne se produit pas.
    Graphiquement, le bouton est "encadré" comme s'il avait le focus au lancement du script, alors qu'il ne l'a pas.
    Si je déplace le focus sur un autre widget et qu'ensuite je remet le curseur dans la lineEdit, le bouton reprend cette apparence de focus.
    Rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.lineEdit.returnPressed.connect(self.on_line_edited)
    ne change rien. En plus de faire double emploi.
    Il s'agit toujours du premier bouton dans l'ordre de création.

    Bon, j'ai plusieurs pushButton, si je convertis le premier en toolButton, je ne fais que déplacer le problème vers le suivant.

    Testé sous Linux
    Python 2.6, Qt 4.6.2, PyQt4 4.7.2
    et Python 3.2.2, Qt 4.8.0, PyQt4 4.9

    Une idée ?
    J'ai le sentiment d'un bug Qt, personnellement. Quoique un bug qui survit de la version 4.6.2 à 4.8.0 ce serait plus qu'étonnant.

    Merci, de vos lumières.

  2. #2
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Je suis réconcilié avec Google.

    Les QPushButton peuvent intercepter un return sous certaines conditions, dans un dialogue il y a toujours un bouton par défaut qui est isDefault() == True et cela malgré le cas d'une lineEdit qui est pourtant censée phagocyter tous les évènements clavier.

    Il faut donc mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.monBouton.setAutoDefault(False)
    à chacun de ses boutons pour ne pas se gâcher la matinée comme moi.

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

Discussions similaires

  1. Signal entre threads
    Par Nymar dans le forum Débuter
    Réponses: 6
    Dernier message: 04/04/2013, 23h27
  2. Réponses: 28
    Dernier message: 27/11/2007, 10h40
  3. Réponses: 4
    Dernier message: 21/06/2007, 14h14
  4. Interférence entre références ?!
    Par janou dans le forum Access
    Réponses: 2
    Dernier message: 12/12/2005, 18h36

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