【发布时间】: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