PyQt5:在QGraphicsView中,重新绑定ScrollHandDrag以使用鼠标中键,而不仅仅是鼠标左键

时间:2018-07-28 00:02:17

标签: python qt pyqt5 qgraphicsview qgraphicsitem

我正在使用地图编辑器,其中使用QGraphicsView显示QGraphicsObject(地图)。我已经实现了this post中的图像缩放功能,并且尝试使用其平移实现,并发现它可以工作。但是,我希望能够在不切换的情况下进行平移,只需按住鼠标中键并从那里拖动即可。

我已经编写了这段代码来在两种模式(正常和拖动)之间切换,然后在mouse(Press/Release)Events上调用它。

(在QGraphicsView中)

def toggleDragMode(self):
    if self.dragMode() == QGraphicsView.ScrollHandDrag:
        self.setDragMode(QGraphicsView.NoDrag)
        self.pointerMode = PointerMode.Normal
    else:
        self.setDragMode(QGraphicsView.ScrollHandDrag)
        self.pointerMode = PointerMode.Drag

def mousePressEvent(self, event):
    if event.buttons() & Qt.MiddleButton:
        self.toggleDragMode()
    ...
    super().mousePressEvent(event)

def mouseReleaseEvent(self, event):
    if self.dragMode() == QGraphicsView.ScrollHandDrag:
        self.setDragMode(QGraphicsView.NoDrag)
        self.pointerMode = PointerMode.Normal
    super().mouseReleaseEvent(event)

(旁注:使用mouseReleaseEvent时,我发现无法使用event.buttons() & Qt.MiddleButton来检查中间按钮是否已释放,因此在这种情况下,我总是检查并释放。)

但是,每当我尝试单击鼠标中键并拖动时,都不会发生平移。但是,我已经确认,只要我使用鼠标左键作为绑定(即if event.buttons() & Qt.LeftButton: toggleDrag()),此方法就可以正常工作。 QGraphicsView.mouseMoveEvent()中必须有一些代码可以检查是否按住了左键并且光标处于DragMode。有没有办法在更深层次上更改键绑定?

编辑:我刚刚找到this link,并通过这样做(在QGraphicsView中进行了尝试)

def __init__(*args, **kwargs):
  ...
  self.STOP_GLOBAL_SCROLLING = 1

但无济于事。不过,这是一个有趣的线索。

0 个答案:

没有答案