2017-03-09 3 views
0

Je veux faire un QGraphicsScene et le montrer dans QGraphicsView. Je veux faire défiler la scène avec le bouton du milieu de la souris et faire une sélection élastique par le bouton gauche. Mais je ne sais pas comment faire apparaître la sélection élastique seulement avec le bouton gauche de la souris.QGraphicsView: comment faire apparaître la sélection élastique seulement sur le bouton gauche de la souris?

Voici mon code:

# -*- coding: utf-8 -*- 

import os, sys 

from PyQt5 import QtWidgets, QtCore, QtGui, QtSvg 

class MegaSceneView(QtWidgets.QGraphicsView): 
    def __init__(self, parent=None): 
     super(MegaSceneView, self).__init__(parent) 
     self._scale_factor = 1.0 

     self._scale_by = 1.2 
     self.setAcceptDrops(True) 

     self.setRenderHint(QtGui.QPainter.Antialiasing) 
     self.setMouseTracking(True) 
     self.setRubberBandSelectionMode(QtCore.Qt.IntersectsItemShape) 
     self.setDragMode(QtWidgets.QGraphicsView.RubberBandDrag) 

     self._prev_mouse_scene_pos = None 


    def mousePressEvent(self, event): 
     if (event.buttons() & QtCore.Qt.MidButton) != QtCore.Qt.NoButton: 
      self._prev_mouse_scene_pos = (event.pos()) 
     super(MegaSceneView, self).mousePressEvent(event) 

    def mouseReleaseEvent(self, event): 
     super(MegaSceneView, self).mouseReleaseEvent(event) 
     self._prev_mouse_scene_pos = None 

    def mouseMoveEvent(self, event): 
     super(MegaSceneView, self).mouseMoveEvent(event) 

     if (event.buttons() & QtCore.Qt.MidButton) != QtCore.Qt.NoButton: 
      cur_mouse_pos = (event.pos()) 
      if self._prev_mouse_scene_pos is not None: 
       delta_x = cur_mouse_pos.x() - self._prev_mouse_scene_pos.x() 
       delta_y = cur_mouse_pos.y() - self._prev_mouse_scene_pos.y() 

       self.horizontalScrollBar().setValue(self.horizontalScrollBar().value() - delta_x) 
       self.verticalScrollBar().setValue(self.verticalScrollBar().value() - delta_y) 

      self._prev_mouse_scene_pos = (event.pos()) 

if __name__ == "__main__": 

    app = QtWidgets.QApplication(sys.argv) 

    mega_view = MegaSceneView() 

    mega_scene = QtWidgets.QGraphicsScene(-500, -500, 1000, 1000) 
    # mega_scene = QtWidgets.QGraphicsScene() 

    rect_item_1 = QtWidgets.QGraphicsRectItem(-30, -20, 60, 40) 
    mega_scene.addItem(rect_item_1) 

    rect_item_2 = QtWidgets.QGraphicsRectItem(-20, -30, 40, 60) 
    mega_scene.addItem(rect_item_2) 
    rect_item_2.setPos(300, 200) 

    mega_view.setScene(mega_scene) 
    mega_view.show() 

    sys.exit(app.exec_()) 

Que dois-je ajouter pour faire la bande de caoutchouc apparaissent uniquement par le bouton gauche?

Répondre

0

Il n'existe pas de méthode intégrée pour ce faire. Vous devrez sous-classer les mousePressEvent, mouseMoveEvent et mouseReleaseEvent pour votre vue graphique et créer l'élastique visible vous-même. (QRubberBand fonctionne bien pour cela.) Lorsque l'utilisateur relâche la souris, vous devez ensuite convertir les extensions de bande en coordonnées de scène et appeler le QGraphicsScene::setSelectionArea.