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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #!/usr/bin/env python3 # -*- coding: utf-8 -*- from PyQt5 import QtCore, QtGui, QtWidgets
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 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()Retour de la console lors de l’exécution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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')
=========================
Pouvez vous me dire ce que j'ai mal compris?
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 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
Partager