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

Qt Discussion :

Slot appelé deux fois lors d'une seule pression sur un bouton


Sujet :

Qt

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 40
    Points : 27
    Points
    27
    Par défaut Slot appelé deux fois lors d'une seule pression sur un bouton
    Bonjours à tous,

    Je m'explique : j'ai créé une interface avec Qt Designer qui contient un bouton.
    J'utilise l'auto-connect pour connecter le signal clicked() envoyé par le bouton à la méthode voulue. J'ai donc créé une méthode on_button_clicked().

    J'éxécute mon code, et là, surprise, la méthode on_button_clicked() est appelé deux fois quand je clique une fois sur le bouton !

    Pourquoi ?

    P.S. : J'utilise PyQt4 sous Mac OS X avec Qt 4.4, si ça peut être utile...

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut
    peut être
    http://qt.developpez.com/faq/?page=qt4Core#autoconnect
    REMARQUE2: Si QMetaObject::connectSlotsByName est appelé plusieurs fois, les connections générées seront multiples. Lors de l'utilisation d'un *.ui, ne pas oublier que la fonction setupUi appel l'autoconnection

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 40
    Points : 27
    Points
    27
    Par défaut
    Ca ne doit pas être ça.

    La fonction connectSlotsByName est appelée une seule fois (dans setupUi), et j'ai vérifié que setupUi n'était pas appelée deux fois. D'ailleurs, quand je met cette ligne en commentaire, l'auto-connect ne marche plus.

    De toute façon, j'ai essayé d'utiliser pressed et released à la place de clicked, et là tout fonctionne.

    Le plus étrange, c'est qu'en appelant un autre fois connectSlotsByName, la méthode est appelée 4 fois et non 3, comme si chaque appel connectait deux fois clicked() !

    Je ne comprend vraiment pas ce qui se passe.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 40
    Points : 27
    Points
    27
    Par défaut
    Je viens de trouver la raison. Il s'agit d'un problème spécifique à PyQt dû au fait que python ne supporte pas la surcharge des fonctions (typage dynamique oblige), et qu'il existe deux signal clicked pour QPushButton, un avec un argument et l'autre sans.

    Je poste ici la solution trouvée sur le site suivant : http://www.mail-archive.com/pyqt@riv.../msg09089.html

    > > I was used to connect signals and slots using "connect". Now I am
    > > updating myself to Qt4 and using "autoconnect" feature.
    > >
    > > I have the simplest code that I can do and the slot is called two times.
    > > The code is:
    >
    > This is known, but I'm not sure it is documented in the PyQt4 docs.
    > There are actually 2 signals in QPushButton that are called "clicked",
    > one takes an argument one doesn't. I don't know how the connection is
    > done by PyQt, but you end up having both signals connected to your slot.
    >
    > The proper way to solve this is to use a method signature telling PyQt4
    > which signal you want to connect to, by giving the proper arguments.
    > This is documented in the PyQt4 docs (I don't have an example at hand).

    ops completly my blame, I haven't read all documentation (ops!). I have
    solved the pushButton_2_clicked on that way:

    @QtCore.pyqtSignature("")
    def on_pushButton_2_clicked(self):
    print "automatic"

    More information:
    http://www.riverbankcomputing.com/Do...ture-decorator

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/07/2014, 08h08
  2. Deux moteurs interbase pour une seule base ?
    Par Yurck dans le forum InterBase
    Réponses: 11
    Dernier message: 21/09/2006, 15h45
  3. Réponses: 6
    Dernier message: 17/08/2006, 19h16
  4. Réponses: 1
    Dernier message: 24/05/2006, 15h25
  5. Réponses: 14
    Dernier message: 30/03/2005, 21h50

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