Bonjour,

j'essaye actuellement d'intégrer une zone de "graphique" (à l'aide des QGraphicsScène et QGraphicsView) dans une fenêtre potentiellement remplie avec d'autres widgets. (En gros, au final, je souhaite juste tracer des droites horizontales ou verticales dans ce cadre "graphique").

j'aimerais que l'évènement "clic" de la souris soit actif uniquement lorsque le clic est réalisé sur le QgraphicsScene et soit inactif si je clic ailleurs... parce qu'au clic sur le QgraphicsScene j'aimerais tracer une droite à partir de l'endroit qui est cliqué...

ci dessous le code tel qu'il est actuellement. Mon problème c'est que lorsque je clique n'importe ou dans la fenêtre (hors zone de traçage), l'évènement "clic" reste actif et induit une droite dans la zone de traçage...
aussi, quand je clique dans la zone de traçage, j'ai un décalage qui est probablement du au fait que je n'arrive pas à "cadrer" ma zone de traçage.

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/usr/bin/env python
 
from PyQt5.QtCore import (QLineF, QPointF, QRectF, Qt)
from PyQt5.QtGui import (QBrush, QColor, QPainter,QPen,QFont)
from PyQt5.QtWidgets import (QApplication, QGraphicsView, QGraphicsScene, QGraphicsItem,
                             QGridLayout, QVBoxLayout, QHBoxLayout,
                             QLabel, QLineEdit, QPushButton,QWidget, QMainWindow)
 
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
 
        fenetre_widget = QWidget()
 
        self.scene = QGraphicsScene(self)
        self.scene.setSceneRect(0, 0, 200, 200)
        self.scene.clear()
 
        self.view =QGraphicsView(self.scene)
        self.view.setScene(self.scene)
        self.view.setCacheMode(QGraphicsView.CacheBackground)
 
        self.pen=QPen()
        self.pen.setWidth(1)
        self.pen2=QPen()
        self.pen2.setWidth(5)
 
        self.label1=QLabel("Test")
        self.label1.setFixedWidth(400)
 
        layouthorizontal1 = QHBoxLayout()
        layouthorizontal1.addWidget(self.view)
        layouthorizontal1.addWidget(self.label1)
 
        fenetre_widget.setLayout(layouthorizontal1)        
        self.setCentralWidget(fenetre_widget)
 
        self.nb_droite=0
 
    def keyPressEvent(self, event):
        key = event.key()
        if key == Qt.Key_R:
            self.scene.clear()
        super(MainWindow, self).keyPressEvent(event)
    def mousePressEvent(self, event):
        pos = event.pos()
        print(pos)
        taillex=self.width()
        tailley=self.height()
        if self.nb_droite<2:
            if self.nb_droite==0:
                self.pos1x=pos.x()
                self.pos1y=pos.y()
                print(self.pos1x,self.pos1y)
            elif self.nb_droite==1:
                self.pos2x=pos.x()
                self.pos2y=pos.y()
                print(self.pos2x,self.pos2y)
            self.scene.addLine(pos.x(),0,pos.x(),tailley,self.pen)
            self.nb_droite = self.nb_droite+1
            if self.nb_droite==2:
                label=self.scene.addSimpleText (str(abs(self.pos1x-self.pos2x)) + " pixels", QFont('Norasi', 12))
                ligne_legende=self.scene.addLine (20,tailley-15,(abs(self.pos1x-self.pos2x)/2),tailley-15,self.pen2)
                label.setY(tailley-40)
                label.setX(20)
                print(self.pos1x-self.pos2x)
        elif self.nb_droite==2:
            self.scene.clear()
            self.nb_droite=0
 
if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())