<p>以上答案部分正确。在我看来,您的方法是尝试通过分解视口比例来转换场景。“m11和m22”。但是,放大时,视口比例将小于1。
translate函数不接受低于1的值。尝试打印出DeltaX放大时,您将看到只有在DeltaX>;1. </p>
<p>您可以采取的两种方法是:</p>
<p>A)当增量轴'大于0时,手动将其四舍五入到1.1左右,即大于1</p>
<pre><code>transform = self.transform()
deltaX = delta.x() / transform.m11()
deltaY = delta.y() / transform.m22()
if 1 > deltaX > 0.1:
deltaX = 1.1
if 1 > deltaY > 0.1:
deltaY = 1.1
</code></pre>
<p>B)像上面提到的eyllanesc一样,将视口投影到场景中,这样所做的任何转换都将在相对于视口空间的场景空间中进行。此外,为了使缩放定位保持一致,还可以在缩放场景时将鼠标位置转换为场景空间。最后,eyllanesc添加了一行冗余的代码,可以正确地进行翻译。按下鼠标按钮时,无需重置鼠标的原点位置</p>
<p>因此,你可以得到这样的结果</p>
<pre><code>def __init__(self, parent):
super(GraphicsThingy, self).__init__(parent)
self.setTransformationAnchor(QGraphicsView.NoAnchor)
self.setResizeAnchor(QGraphicsView.NoAnchor)
self.installEventFilter(self)
self.mousePos = None
def wheelEvent(self, event):
if event.modifiers() & Qt.ControlModifier:
scaleDelta = event.angleDelta().y() / 35
factor = pow(self.zoomMultiplier, scaleDelta)
originalPos = self.mapToScene(event.pos())
self.scale(factor, factor)
newPos = self.mapToScene(event.pos())
deltaPos = newPos - originalPos
self.translate(deltaPos.x(), deltaPos.y())
event.accept()
def mousePressEvent(self, event):
if event.button() == Qt.MiddleButton:
self.mousePos = self.mapToScene(event.pos())
event.accept()
def mouseMoveEvent(self, event):
if self.movePos is not None:
delta = self.mousePos - self.mapFromScene(event.pos())
# Keeps scrolling speed consistent with zoom. Max(v,1) Ensures that the scale value will not multiply the scrolling speed.
delta.setX(delta.x() / max(self.transform().m11(),1))
delta.setY(delta.y() / max(self.transform().m22(),1))
# Change scene scene rect position based on delta
rect = self.mapToScene(self.viewport().rect()).boundingRect()
self.setSceneRect(rect.translated(delta))
self.update()
event.accept()
def mouseReleaseEvent(self, event):
self.mousePos = None
</code></pre>