QgraphicsView:如何使橡皮筋选择仅显示在左鼠标按钮上



我想制作一个QGraphicsScene并在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中设置拖放模式,而mouseReleaseEvent在视图类中函数,因此它将其保留在RubberBandDrag中为默认值,但是当持有中间鼠标按钮时,请切换到NoDrag模式。

喜欢-C ,但是所有语言中的想法都是相同的 -

void YourViewClass::mousePressEvent(QMouseEvent* event)    {
    if (event->buttons() == Qt::MiddleButton)
        setDragMode(QGraphicsView::NoDrag);
}
void YourViewClass::mouseReleaseEvent(QMouseEvent* event)    {
    if (event->button() == Qt::MiddleButton)
        setDragMode(QGraphicsView::RubberBandDrag);
}

没有内置的方式来执行此操作。您需要为您的图形视图子 mousePressEventmouseMoveEventmouseReleaseEvent子类别,并自己创建可见的橡皮筋。(QRubberBand对此效果很好。)当用户发布鼠标时,您需要将橡皮筋范围转换为场景坐标并致电QGraphicsScene::setSelectionArea

相关内容

  • 没有找到相关文章

最新更新