2017-03-09 5 views
0

QGraphicsSceneにしてQGraphicsViewに表示します。マウスの中ボタンでシーンをスクロールし、左ボタンでラバーバンドを選択したい。しかし、ゴムバンドの選択をマウスの左ボタンでのみ行う方法はわかりません。QGraphicsView:ゴムバンドの選択をマウスの左ボタンでのみ行う方法を教えてください。

は、ここに私のコードです:

# -*- 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_()) 

私はゴムバンドは、左ボタンでのみ表示されるようにするために何を追加する必要がありますか?

答えて

0

これを行うための組み込みの方法はありません。あなたのグラフィックビューにmousePressEventmouseMoveEvent、およびをサブクラス化し、目に見えるラバーバンドを自分で作成する必要があります。 (QRubberBandはこれでうまくいきます。)ユーザーがマウスを離したら、ラバーバンドエクステントをシーン座標に変換してQGraphicsScene::setSelectionAreaを呼び出す必要があります。

関連する問題