2009-06-07 13 views
2

Je veux hériter de QLabel pour y ajouter le traitement des événements de clic. J'essaie ce code:PyQt - QLabel héritant

class NewLabel(QtGui.QLabel): 
    def __init__(self, parent): 
     QtGui.QLabel.__init__(self, parent) 

    def clickEvent(self, event): 
     print 'Label clicked!' 

Mais après avoir cliqué sur je n'ai pas la ligne 'étiquette clic!

EDIT:

Ok, maintenant je me sers pas 'clickEvent' mais 'mousePressEvent'. Et j'ai encore une question. Comment puis-je savoir sur quoi exactement l'étiquette a été cliquée? Par exemple, j'ai 2 boîte d'édition et 2 étiquettes. Le contenu des étiquettes sont des pixmaps. Donc, il n'y a pas de texte dans les étiquettes, donc je ne peux pas discerner la différence entre les étiquettes. Comment puis je faire ça?

EDIT2: J'ai fait ce code:

class NewLabel(QtGui.QLabel): 
    def __init__(self, firstLabel): 
     QtGui.QLabel.__init__(self, firstLabel) 

    def mousePressEvent(self, event): 
     print 'Clicked' 
     #myLabel = self.sender() # None =) 
     self.emit(QtCore.SIGNAL('clicked()'), "Label pressed") 

Dans une autre classe:

self.FirstLang = NewLabel(Form) 
QtCore.QObject.connect(self.FirstLang, QtCore.SIGNAL('clicked()'), self.labelPressed) 

fente dans la même classe:

def labelPressed(self): 
    print 'in labelPressed' 
    print self.sender() 

Mais il n'y a pas expéditeur objet en soi. Qu'est-ce que j'ai fait de mal?

+0

Je ne sais pas comment fonctionne PyQt mais vous obtenez sender() de QObject, la classe avec le slot labelPressed hérite-t-elle de QObject? il devrait puisqu'il a un slot ... au moins en C++. –

Répondre

1

répondre à votre deuxième question, je vais poursuivre sur la base par exemple @gnud:

  • sous-classe QLabel, passer outre mouseReleaseEvent et ajouter un signal à la classe, appelons-le cliqué.
  • Vérifiez quel bouton a été cliqué dans mouseReleaseEvent, si c'est le bouton gauche qui émet le signal cliqué.
  • connectez une fente au signal cliqué sur vos étiquettes et utilisez sender() à l'intérieur pour savoir quel QLabel a été cliqué.
1

Il n'y a pas de fonction clickEvent dans QWidget/QLabel. Vous pouvez connecter cette fonction à un signal Qt, ou vous pouvez faire:

class NewLabel(QtGui.QLabel): 
    def __init__(self, parent=None): 
     QtGui.QLabel.__init__(self, parent) 
     self.setText('Lorem Ipsum') 

    def mouseReleaseEvent(self, event): 
     print 'Label clicked!' 
1

La réponse des PyQt Wiki fonctionne très bien, mais je voudrais ajouter que la classe clickable devrait appeler widget.mouseReleaseEvent (juste avant return True), juste au cas où l'utilisateur a personnalisé cet événement.

+0

Bon point - mais il serait encore plus correct que le 'eventFilter' retourne simplement' false False' dans tous les cas (puisqu'il ne gère pas réellement l'événement). – ekhumoro