QGraphicsView:如何使橡皮筋选择只出现在鼠标左键上?
问题描述:
我想打一个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_())
我应该补充,使皮筋只能通过左键出现?
答
没有内置的方式做到这一点。您将需要继承mousePressEvent
,mouseMoveEvent
和mouseReleaseEvent
为您的图形视图,并创建可见橡皮筋自己。 (QRubberBand
很适合这个)。当用户释放鼠标,那么你需要的橡皮筋范围转换成坐标的场景和呼叫QGraphicsScene::setSelectionArea
。