Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Les events et les signaux PyQt

+4 votes

Soit le widget suivant :

class Button(QGraphicsPixmapItem):

    clicked = pyqtSignal()

    def __init__(self, pixmap):
        QGraphicsPixmapItem.__init__(self, QPixmap(pixmap))

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.clicked.emit()
            QGraphicsPixmapItem.mousePressEvent(self, event)
        else:
            QGraphicsPixmapItem.mousePressEvent(self, event)

Lorsque je clique dessus (dans une scene bien définie et tout et tout, mais je passe cette partie, elle présente pas d'intérêt) j'obtiens cette erreur :

TypeError: LeftButton cannot be converted to PyQt5.QtCore.QObject in this context

Alors, tout simplement, d'où ça vient ?
Et, un peu plus compliqué, comment émettre un signal dans le cas de la réception d'un event (puisque ça a pas l'air possible comme ça...) ?

Sachant que j'ai déjà essayé de créer une fonction à part que mon programme appellerai et qui émetterai le signal, ça marche pas non plus.

demandé 3-Jun-2015 par Laërte (346 points)

1 Réponse

+5 votes
 
Meilleure réponse

Puisque j'ai trouvé moi-même, je vais répondre à ma propre question (comme ça peut-être que je chercherai plus avant de demander la prochaine fois ^^)

Le système de signaux/slots en Qt n'est disponible que pour les classes dérivant de QObject.
Mon erreur a été de croire que QGraphicsPixmapItem dérivait de QObject, alors qu'en fait elle ne dérive que de QGraphicsItem, qui est une classe 'root' (ne descend de personne).

Pour pouvoir utiliser un objet QGraphicsItem avec les signaux et les slots, il faut créer une classe dérivée de QGraphicsObject qui dérive à la fois de QGraphicsItem et de QObject

Ma classe devra donc être :

class Button(QGraphicsWidget):

    clicked = pyqtSignal()

    def __init__(self, pixmap):
        QGraphicsWidget.__init__(self)
        icon = QGraphicsPixmapItem(QPixmap(pixmap), self)

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.clicked.emit()
            QGraphicsWidget.mousePressEvent(self, event)
        else:
            QGraphicsWidget.mousePressEvent(self, event)
répondu 4-Jun-2015 par Laërte (346 points)
...