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 :

Deux actions differentes sur un meme bouton ?


Sujet :

PyQt Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut Deux actions differentes sur un meme bouton ?
    Voila,

    Je voudrais pouvoir faire 2 actions différente sur un même bouton :
    - Clic gauche : action 1
    - Clic droit : action 2

    Je ne veux pas faire apparaître de menu.

    Il doit être possible de recuperer l'event de la souris non ?

    J'ai vu le clic, le press, release et double clic mais rien pour le clic droit.

    J'ai vu ca : http://qt.developpez.com/doc/4.7/qt/#mousebutton-enum
    mais ca ne semble pas etre ce qu'il me faut.

    Une idée sur la chose ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 326
    Points : 36 844
    Points
    36 844
    Par défaut
    Salut,
    Lorsqu'on clique sur un bouton de la souris, le QWidget déclenche un mousePressEvent que l'on peut surcharger dans une s/classe du widget.
    La méthode reçoit un event en paramètre qui est instance de QMouseEvent.
    C'est dans les attributs de cet event que l'on pourra récupérer le .button qui a cause l'event.
    C'est lui l'enum de la doc. que vous montrez.
    - W

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà un petit code qui affiche le bouton cliqué (gauche, droit, milieu):

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division, print_function
    # Python 2.7
     
    import sys
    from PyQt4 import QtGui, QtCore
     
    class Fenetre(QtGui.QWidget):
     
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
            self.resize(300, 200)
     
        def mousePressEvent(self, event):
            if event.button() == QtCore.Qt.LeftButton:
                print("clic bouton gauche")
            elif  event.button() == QtCore.Qt.RightButton:
                print("clic bouton droit")
            elif event.button() == QtCore.Qt.MiddleButton:
                print("clic bouton milieu")
     
    if __name__=='__main__':
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Merci pour ces reponses et surtout ce petit code tellement comprehensible

    Si je comprends bien, pour savoir le widget sur lequel il y a eu un clic, il faut utiliser :
    c'est ça ?


    Par contre je vois que tous les widgets ne renvoient pas l'info de clic (genre le qlineedit, combobox) mais ca marche sur les boutons et c'est ce que je voulais

    merci beaucoup !

    EDIT : En fait ca ne marche pas mon système pour déterminer quel est le widget actif...
    j'ai voulu testé hasEditFocus mais incompatible avec les boutons...

    J'arrive donc à récupérer le nom du bouton via focusWidget mais je ne vois pas trop à quoi le comparer pour savoir si c'est le bon bouton...

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 478
    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 478
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par hizoka Voir le message
    Par contre je vois que tous les widgets ne renvoient pas l'info de clic (genre le qlineedit, combobox) mais ca marche sur les boutons et c'est ce que je voulais
    ...
    EDIT : En fait ca ne marche pas mon système pour déterminer quel est le widget actif...
    j'ai voulu testé hasEditFocus mais incompatible avec les boutons...

    J'arrive donc à récupérer le nom du bouton via focusWidget mais je ne vois pas trop à quoi le comparer pour savoir si c'est le bon bouton...
    Tous les widgets qui acceptent le focus, génèrent un signal en prenant et en abandonnant le focus. On peut donc faire converger tous ces signaux vers une même méthode qui posera les bonnes questions.

    Par exemple:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # Python 2.7
     
    import sys, os
     
    from PyQt4 import QtCore, QtGui
     
    #############################################################################
    class Fenetre(QtGui.QWidget):
     
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
     
            self.bouton1 = QtGui.QPushButton(u"bouton 1", self)
            self.bouton1.focusInEvent = self.quelWidgetALeFocus
     
            self.bouton2 = QtGui.QPushButton(u"bouton 2", self)
            self.bouton2.focusInEvent = self.quelWidgetALeFocus
     
            self.edit = QtGui.QLineEdit(self)
            self.edit.focusInEvent = self.quelWidgetALeFocus
     
            self.combo = QtGui.QComboBox(self)
            self.combo.focusInEvent = self.quelWidgetALeFocus
     
            posit = QtGui.QGridLayout()
            posit.addWidget(self.bouton1, 0, 0)
            posit.addWidget(self.bouton2, 1, 0)
            posit.addWidget(self.edit, 2, 0)
            posit.addWidget(self.combo, 3, 0)
            self.setLayout(posit)
     
        def quelWidgetALeFocus(self, fEvent):
     
            focusW = self.focusWidget()
            if focusW==self.bouton1:
                print u"le bouton 1 vient d'avoir le focus!"
                QtGui.QPushButton.focusInEvent(self.bouton1, fEvent)
            elif focusW==self.bouton2:
                print u"le bouton 2 vient d'avoir le focus!"
                QtGui.QPushButton.focusInEvent(self.bouton2, fEvent)
            elif focusW==self.edit:
                print u"le qlineedit vient d'avoir le focus!"
                QtGui.QLineEdit.focusInEvent(self.edit, fEvent)
            elif focusW==self.combo:
                print u"le combobox vient d'avoir le focus!"
                QtGui.QComboBox.focusInEvent(self.combo, fEvent)
     
    #############################################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Il faut, bien sûr, que le focus soit accepté pour les widgets en question (ce qui n'est pas le cas pour un QLabel par exemple).

    Ça marche pour les changements de focus provoqués par le clavier (tab) et par la souris. Si nécessaire, on peut intervenir avec setFocusPolicy pour changer cela.

    Par contre, le signal n'est pas déclenché une seconde fois pour un widget qui aurait déjà le focus et sur lequel on re-cliquerait. Mais pour un QLineEdit, par exemple, on peut récupérer si nécessaire un signal pour un changement de position du curseur.

    A noter que lorsque la fenêtre vient d'être active à l'écran, le 1er widget qui a le focus, ici le bouton1, (voir la liste des widgets dans l'ordre des focus) génère aussi le signal. Mais ça ne veut pas dire qu'on a cliqué sur le bouton!

    J'ai fait ça rapidement. Peut-être faut-il compléter? Ou simplifier? On peut ajouter si nécessaire la même chose avec la perte de focus si ça a un sens pour l'application.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 326
    Points : 36 844
    Points
    36 844
    Par défaut
    Citation Envoyé par hizoka Voir le message
    Par contre je vois que tous les widgets ne renvoient pas l'info de clic (genre le qlineedit, combobox) mais ca marche sur les boutons et c'est ce que je voulais
    qlineedit et combobox déclenchent mousePressEvent.

    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
    from PyQt4.QtGui import QApplication, QWidget, QVBoxLayout, QPushButton, QLineEdit, QComboBox
    from PyQt4 import QtCore, QtGui
     
    def mousePressEvent(self, event):
        print ('mousePressEvent: %s' % type(self).__name__)
        return super(type(self), self).mousePressEvent(event)
     
    class PushButton(QPushButton):
        mousePressEvent = mousePressEvent
    class LineEdit(QLineEdit):
        mousePressEvent = mousePressEvent
    class ComboBox(QComboBox):
        mousePressEvent = mousePressEvent
     
    if __name__ == '__main__':
        app = QApplication([])
        window = Window()
        layout = QVBoxLayout()
        layout.addWidget(PushButton('button', window))
        layout.addWidget(LineEdit(window))
        layout.addWidget(ComboBox(window))
        window.setLayout(layout)
        window.show()
        app.exec()
    - W

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Merci à vous deux !

    En faisant 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
    30
    31
    32
    33
    34
    35
    36
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from PyQt4.QtGui import QApplication, QWidget, QVBoxLayout, QPushButton, QLineEdit, QComboBox
    from PyQt4.QtGui import *
    from PyQt4.QtCore import *
     
    def mousePressEvent(self, event):
        print ('mousePressEvent: %s' % type(self).__name__)
     
        if event.button() == Qt.LeftButton:
            print("clic bouton gauche")
        elif  event.button() == Qt.RightButton:
            print("clic bouton droit")
        elif event.button() == Qt.MiddleButton:
            print("clic bouton milieu")
     
        return super(type(self), self).mousePressEvent(event)
     
    class BoutonTest(QPushButton):
        mousePressEvent = mousePressEvent
    class LineTest(QLineEdit):
        mousePressEvent = mousePressEvent
    class ComboTest(QComboBox):
        mousePressEvent = mousePressEvent
     
     
    if __name__ == '__main__':
        app = QApplication([])
        window = QDialog()
        layout = QVBoxLayout()
        layout.addWidget(BoutonTest('button', window))
        layout.addWidget(LineTest(window))
        layout.addWidget(ComboTest(window))
        window.setLayout(layout)
        window.show()
        app.exec()
    je sais quel est le widget cliqué et quel bouton !

    il va falloir que je vois pour essayer d'integrer ça un peu plus tard !

    merci

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

Discussions similaires

  1. Avoir deux action differentes pour le meme form
    Par dearraed dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 24/03/2010, 16h08
  2. plusieurs action sur un meme bouton
    Par francksilvagni dans le forum Flash
    Réponses: 8
    Dernier message: 04/05/2007, 17h54
  3. Actions différentes por un même clip
    Par yotux dans le forum Flash
    Réponses: 4
    Dernier message: 20/06/2006, 19h50
  4. Réponses: 2
    Dernier message: 05/03/2006, 20h45
  5. utiliser "if" pour faire deux actions differente
    Par vampyer972 dans le forum C
    Réponses: 2
    Dernier message: 09/05/2004, 10h12

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