【问题标题】:How do I mouse-drag-zoom a QGraphicsView anchored to the mouse drag starting position?如何鼠标拖动缩放锚定到鼠标拖动起始位置的 QGraphicsView?
【发布时间】:2017-07-29 15:43:15
【问题描述】:

我正在尝试单击并拖动以放大和缩小 QGraphicsView,就像您在 Maya 和 Nuke 等图形应用程序中看到的那样。有很多关于使用鼠标滚轮的信息,但我没有找到任何与拖动缩放相关的信息。

有没有一种简单的方法可以做到这一点,还是我需要自己实现“锚”效果?

以下内容将起作用,但是当我拖动缩放时,视图会跟随鼠标移动,而不是看起来放大和缩小空间中的固定点(单击鼠标开始拖动缩放的点。

(这是从我的更复杂的源代码中复制和粘贴的一堆。虽然它应该运行,但它的目的是说明性的)

def mousePressEvent(self, event):
    self.press_mouse_pos = event.pos()
    transform = self.transform()
    self.press_translate = [transform.m31(), transform.m32()]
    self.press_scale = transform.m11()

    if event.button() == QtCore.Qt.RightButton and \
                    event.modifiers() == QtCore.Qt.AltModifier:
        self.scaling = True
        event.accept()
    else:
        super(GraphView, self).mousePressEvent(event)

def mouseMoveEvent(self, event):
    if self.scaling:
        delta_pos = event.pos() - self.press_mouse_pos
        amount = delta_pos.x() + delta_pos.y()
        speed = 0.001
        scl = self.press_scale - (amount * speed)
        scl = min(1.0, max(scl, 0.1))  # Clamp so we don't go to far in or out

        transform = QtGui.QTransform(
            scl, 0, 0,
            0, scl, 0,
            self.press_translate[0], self.press_translate[1], 1
        )

        # If interactive is True then some double calculations are triggered
        prev_interactive_state = self.isInteractive()
        prev_anchor_mode = self.transformationAnchor()

        self.setInteractive(False)
        self.setTransformationAnchor(QtGui.QGraphicsView.AnchorUnderMouse)

        self.setTransform(transform)

        self.setInteractive(prev_interactive_state)
        self.setTransformationAnchor(prev_anchor_mode)
    else:
        super(GraphView, self).mouseMoveEvent(event)

def mouseReleaseEvent(self, event):
    self.scaling = False
    super(GraphView, self).mouseReleaseEvent(event)

【问题讨论】:

  • 你解决了吗?在这里遇到了同样的问题。

标签: qt pyqt mouseevent zooming qgraphicsview


【解决方案1】:

改变这个:

    self.setTransformationAnchor(QtGui.QGraphicsView.AnchorUnderMouse)

到那个:

    self.setTransformationAnchor(QtGui.QGraphicsView.NoAnchor)

setTransformation() 是一个需要转换的anchor; AnchorUnderMouse 确保与当前(应用变换时)鼠标位置相对应的场景点保持未平移。

【讨论】:

    猜你喜欢
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多