【问题标题】:Zoom on mouse position QGraphicsView放大鼠标位置 QGraphicsView
【发布时间】:2020-03-16 19:29:34
【问题描述】:

我正在寻找如何在光标位置放大 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.mapToScene()的使用,但一直不成功

【问题讨论】:

    标签: python pyqt pyqt4 qgraphicsview qgraphicsscene


    【解决方案1】:

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

    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)
    

    【讨论】:

    • mapToScene(QPoint) 的问题在于,由于 QPoint 的整数特性,它并不那么精确。我认为(也像documentation suggests)最好映射到鼠标位置覆盖的QRect,然后对scene_pos.boundingRect().center()使用'centerOn'。
    • @musicamante 我已经使用了好几次,但我没有观察到这个错误。你测试过吗?到目前为止,我还无法对其进行测试。
    • 我过去也遇到过类似的问题;虽然它们通常微不足道,但放大时有时会很烦人。我刚刚使用基本网格进行了测试,我可以确认始终存在 -1、-1 像素偏移(基于变换的像素大小 before scaling),随着比例的增加递归地应用。 This image左边是原点的放大图,鼠标滚轮两步的结果,中间是mapToScene(QPoint),右边是mapToScene(QRect)。
    • 这显然假设光标热点在其定义中正确设置。我很确定我的正确设置在光标左上角像素所占据的区域;我可能是错的,但我相信在这种情况下偏移会更大(在一个方向或另一个方向上)。此外,如果光标位置保持不变,无论如何总会有一些偏移量,但我相信 QRect 映射方法更精确。一种可能的解决方法我认为可以通过考虑 QTransform 来设置新位置,但这是另一个...点 ;-)
    猜你喜欢
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 2011-05-03
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多