Bonjour bonjour,

Je vous explique mon problème:

Le but de la manœuvre est de déplacer la vue d'un QGraphicsView (avec setSceneRect) via un déplacement de souris lors d'un clic droit.
Comme par exemple, sur adobe reader. Par contre, je ne veux pas que ma scene est une taille finie.
Sur ma scene se trouve différents QGraphicsProxyWidget déplaçables via un clic gauche + déplacement souris.


1. J'ai réussi à le faire en réimplémentant les méthodes mousePressEvent, mouseMoveEvent et mouseRealeaseEvent de ma classe héritant de QGraphicsScene.
Cependant, j'ai besoin pour la suite de mon programme de réimplémenter ces mêmes méthodes dans ma classe héritant de QGraphicsView. (Par exemple pour faire un zoom sur ma scene)
Lors ce que je fais ça, les trois méthodes réimplémentées de QGraphicsScene ne fonctionne plus.

Question 1 : Est-ce normal ? Est ce que je fais mal quelques chose ?

Finalité, je trouve plus logique de gérer toute ma partie interaction graphique via la classe QGraphicsView et ne pas mélanger les deux.

Voici le code de ma première solution
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
 
class GraphicsScene(QGraphicsScene):
 
    def __init__(self, parent=None):
        super(GraphicsScene, self).__init__(parent)
 
        self.move_scene_locked = True
        self.move_item_locked = True
        self.item = None
 
    def mousePressEvent(self, event):
        # get the widget if we click on a item
        self.item = self.itemAt(event.scenePos(), QTransform())
 
        if event.button() == Qt.LeftButton:
            # Left click --> Move an item on the scene
            self.move_scene_locked = True
            self.move_item_locked = False
            if self.item is not None:
                self.setFocusItem(self.item)
                self.item.item_clicked_from_scene()
 
        elif event.button() == Qt.RightButton:
            # Right click --> Move the view on the scene
            self.move_scene_locked = False
            self.move_item_locked = True
            QApplication.setOverrideCursor(Qt.OpenHandCursor)
 
    def mouseMoveEvent(self, event):
        orig_cursor_position = event.lastScenePos()
        updated_cursor_position = event.scenePos()
 
        # Move an item on the scene
        if self.item is not None and not self.move_item_locked:
            orig_item_position = self.item.scenePos()
            updated_cursor_x = updated_cursor_position.x() - orig_cursor_position.x() + orig_item_position.x()
            updated_cursor_y = updated_cursor_position.y() - orig_cursor_position.y() + orig_item_position.y()
            self.item.setPos(QPointF(updated_cursor_x, updated_cursor_y))
            self.item.item_moved_from_scene(updated_cursor_x, updated_cursor_y)
 
        # Move the view of the scene
        if not self.move_scene_locked:
            QApplication.changeOverrideCursor(Qt.ClosedHandCursor)
            orig_scene_position = self.sceneRect()
            updated_cursor_x = (orig_cursor_position.x() - updated_cursor_position.x())* SPEED_MOVE_FACTOR + orig_scene_position.x()
            updated_cursor_y = (orig_cursor_position.y() - updated_cursor_position.y())* SPEED_MOVE_FACTOR + orig_scene_position.y()
            self.setSceneRect(updated_cursor_x, updated_cursor_y, 500, 500)
 
    def mouseReleaseEvent(self, event):
        self.item = None
        self.move_item_locked = True
        self.move_scene_locked = True
        QApplication.changeOverrideCursor(Qt.ArrowCursor)
Dans le code ci-dessus, pour calculer et obtenir un déplacement fluide de ma vue, j'utilise la fonction lastScenePos() et scenePos() de QGraphicsSceneEvent qui me permet de calculer le déplacement de ma souris.

2. Dans ma nouvelle solution, mes fonctions MoveEvent() sont réimplémentées dans ma classe héritant de QGraphicsView. Or dans cette classe, les event sont des QMouseEvent et ils ne possèdent pas de fonction lastPos()...

Question 2 : Comment vous feriez pour calculer le déplacement de la souris ? Dans le but d'un déplacement fluide. Calculer la différence entre le point où l'on clic et la position de la souris lors du déplacement n'est pas envisageable car plus l'on s'éloigne, plus la View se déplace vite.

Question 3 : Existe t-il une meilleure solution pour faire un déplacement de caméra avec un clic ?

Ma problématique n'est pas très simple à expliquer. Dites moi si vous avec besoin de plus d'informations.

En vous remerciant par avance.
Alexandre