propagation d'event QGraphicsScene
Bonjour,
J'essaie de comprendre comment se propagent les event dans pyqt5
contexte :
======
Je souhaite interactivement tracer des formes (QGraphicsEllipseItem par exemple) au sein d'un QGraphicsScene,
puis pouvoir déplacer ces formes à l'aide de la souris.
Donc interagir avec ma scene et mon ellipse par le biais d'un event mousePressEvent propre à chacun.
Seulement, la scene reçoit bien l'event, mais je n'arrive pas à le propager à l'object ellipse
Piste :
=====
Il me semble qu'il soit possible de contrôler le mécanisme de propagation avec les fonctions accept et ignore, mais sans résultats
Voici les deux objets:
==============
Code:
1 2 3 4
| #!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class MyGraphicScene(QtWidgets.QGraphicsScene):
def __init__(self, parent):
super(MyGraphicScene, self).__init__()
self.setSceneRect(0,0,600,400)
self.clear()
self.wait_for_input = False
def mousePressEvent(self, e):
e.accept()
print('')
print(' --- new event --- ')
print('click on scene')
print(f'wait for input : {self.wait_for_input}')
if self.wait_for_input :
e.accept()
ellipse = MyEllipse(e.scenePos().x(), e.scenePos().y(), 70, 70)
self.addItem(ellipse)
print(ellipse)
self.wait_for_input = False
else:
e.ignore() |
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| class MyEllipse(QtWidgets.QGraphicsEllipseItem):
def __init__(self, x, y, w, h):
super(MyEllipse, self).__init__(x, y, w, h)
self.setFlags(QtWidgets.QGraphicsItem.ItemIsMovable)
self.pen=QtGui.QPen(QtGui.QColor(QtCore.Qt.green))
self.pen.setWidth(15)
self.setPen(self.pen)
def mousePressEvent(self, e):
print('click on ellipse') |
Retour de la console lors de l’exécution :
=========================
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| button clicked # variable wait_for_input à True
ringgraphBtn
--- new event --- # création de l'ellipse à l'endroit du clic sur la scene
click on scene
wait for input : True
<previewgraphicscene.MyEllipse object at 0x7efcd25a5670>
--- new event --- # clic (unique) sur l'ellipse
click on scene
wait for input : False
--- new event --- # double clic sur l'ellipse
click on scene
wait for input : False
click on ellipse |
Pouvez vous me dire ce que j'ai mal compris?