Python 缩放鼠标位置QGraphicsView

Python 缩放鼠标位置QGraphicsView,python,pyqt,pyqt4,qgraphicsview,qgraphicsscene,Python,Pyqt,Pyqt4,Qgraphicsview,Qgraphicsscene,我正在寻找如何在QGraphicsView中放大光标位置。目前我可以缩放,但它缩放的位置不一致 def wheelEvent(self, event): '''Wheel event to zoom ''' # Run default event QtWidgets.QGraphicsView.wheelEvent(self, event) # Define zoom factor fact

我正在寻找如何在QGraphicsView中放大光标位置。目前我可以缩放,但它缩放的位置不一致

    def wheelEvent(self, event):
        '''Wheel event to zoom
        '''
        # Run default event
        QtWidgets.QGraphicsView.wheelEvent(self, event)

        # Define zoom factor
        factor = 1.1
        if event.delta() < 0:
            factor = 0.9

        self.scale(factor, factor)

我见过self.maptosene的使用,但没有成功

一个可能的解决方案是关注鼠标所在的点,缩放并重新计算新中心所在的点:

def wheelEvent(self, event):
    factor = 1.1
    if event.delta() < 0:
        factor = 0.9
    view_pos = event.pos()
    scene_pos = self.mapToScene(view_pos)
    self.centerOn(scene_pos)
    self.scale(factor, factor)
    delta = self.mapToScene(view_pos) - self.mapToScene(self.viewport().rect().center())
    self.centerOn(scene_pos - delta)

一种可能的解决方案是将焦点放在鼠标所在的点上,缩放并重新计算新中心应位于的点:

def wheelEvent(self, event):
    factor = 1.1
    if event.delta() < 0:
        factor = 0.9
    view_pos = event.pos()
    scene_pos = self.mapToScene(view_pos)
    self.centerOn(scene_pos)
    self.scale(factor, factor)
    delta = self.mapToScene(view_pos) - self.mapToScene(self.viewport().rect().center())
    self.centerOn(scene_pos - delta)

mapToSceneQPoint的问题在于,由于QPoint的整数性质,它没有那么精确。我也认为最好映射到鼠标位置所覆盖的QRect,然后对场景使用“centerOn”\u pos.boundingRect.center。@musicamante我已经使用过多次,但我没有观察到该错误。你测试过了吗?到目前为止,我还不能测试它。我过去也有过类似的问题;虽然它们通常都很琐碎,但放大时有时会让人恼火。我刚刚用一个基本网格进行了测试,我可以确认,在缩放之前,根据变换的像素大小,始终存在一个-1,-1像素偏移量,该偏移量随着缩放的增加而递归应用。显示左边的原点的缩放图像,以及鼠标轮的两个步骤的结果,中间的MpToScEngPoT和右边的MpToScEnqReCt。这显然假定光标热点在其定义中被正确设置。我很确定我的设置在光标左上角像素所占据的区域是正确的;我可能错了,但我相信在这种情况下,偏移量在一个方向或另一个方向上会更大。此外,如果光标位置保持不变,在任何情况下都会有一定量的偏移,但我相信QRect映射方法更精确。一个可能的解决方法我认为可以通过考虑QT转换来设置新位置,但这是另一个。。。点-mapToSceneQPoint的问题在于,由于QPoint的整数性质,它没有那么精确。我也认为最好映射到鼠标位置所覆盖的QRect,然后对场景使用“centerOn”\u pos.boundingRect.center。@musicamante我已经使用过多次,但我没有观察到该错误。你测试过了吗?到目前为止,我还不能测试它。我过去也有过类似的问题;虽然它们通常都很琐碎,但放大时有时会让人恼火。我刚刚用一个基本网格进行了测试,我可以确认,在缩放之前,根据变换的像素大小,始终存在一个-1,-1像素偏移量,该偏移量随着缩放的增加而递归应用。显示左边的原点的缩放图像,以及鼠标轮的两个步骤的结果,中间的MpToScEngPoT和右边的MpToScEnqReCt。这显然假定光标热点在其定义中被正确设置。我很确定我的设置在光标左上角像素所占据的区域是正确的;我可能错了,但我相信在这种情况下,偏移量在一个方向或另一个方向上会更大。此外,如果光标位置保持不变,在任何情况下都会有一定量的偏移,但我相信QRect映射方法更精确。一个可能的解决方法我认为可以通过考虑QT转换来设置新位置,但这是另一个。。。点-