为了账号安全,请及时绑定邮箱和手机立即绑定

QGraphicsView.fitInView 令人费解的行为

QGraphicsView.fitInView 令人费解的行为

阿波罗的战车 2023-03-01 17:51:51
我正在尝试制作一个带有两个 QGraphicsView 的小部件,以并排比较两个图像。当用户放大其中一个视图时,另一个视图应放大到同一区域。我的 zoomIn 函数发送一个带有可见场景矩形的信号,另一个视图中的一个槽捕获这个信号并调用QGraphicsView.fitInView(rectangle)使相同的图像区域可见。令我惊讶的是,fitInView似乎将矩形 (x, y, width, height) 视为 (x, y, x + width, y + height)。这是一个错误还是我遗漏了什么?这是我的代码示例:子QGraphicsView类import loggingfrom PyQt5 import (    QtWidgets as qw,    QtCore as qc,    QtGui as qg)class Display(qw.QGraphicsView):    sigViewportAreaChanged = qc.pyqtSignal(qc.QRectF)    def __init__(self, *args, **kwargs):        super(Display, self).__init__(*args, **kwargs)        ..        self.zoomInAction = qw.QAction('Zoom in')        self.zoomInAction.triggered.connect(self.zoomIn)    @qc.pyqtSlot()    def zoomIn(self):        self.scale(1.2, 1.2)        pos = self.viewport().pos()        size = self.viewport().size()        logging.debug(f'{self.objectName()}: viewport:: pos: {pos}, size: {size}')        pos = self.mapToScene(pos)        size = self.mapToScene(size.width(), size.height())        logging.debug(f'{self.objectName()}: scene:: pos: {pos}, size: {size}')        view_area = qc.QRectF(pos.x(), pos.y(), size.x(), size.y())        logging.debug(            f'Emitting changed viewport area, {view_area},\n{mat}')        self.sigViewportAreaChanged.emit(view_area)
查看完整描述

2 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

我相信你的计算方式size是错误的。您应该相对于 的翻译值来计算它pos。既然知道宽高的值,那么就可以view_area根据 的场景值计算 的右下角pos。


viewport_pos = self.viewport().pos()

scene_pos = self.mapToScene(viewport_pos)


width = self.viewport().size().width()

height = self.viewport().size().height()


lower_right_corner = QPointF(width - scene_pos.x(), height() - scene_pos.y())

如果没有减法,您假设的原点view_area是 ,(0, 0)而实际上它是pos。


查看完整回答
反对 回复 2023-03-01
?
MM们

TA贡献1886条经验 获得超2个赞

为了将尺寸缩放到场景坐标系,我将尺寸作为一个点传递给mapToScene.


但是点和大小在概念上是不同的,虽然大小不依赖于坐标系的原点,但点是。 mapToScene,将其论点视为一个点,正在将其翻译以反映新的坐标系。


因此我需要减去新坐标系的原点,它实际上是视口的左上角,以取回尺寸。


一个更简单的解决方案是直接映射视口矩形:


rect = self.mapToScene(self.viewport().rect())  

rect = rect.boundingRect() # mapToScene(rect) returns QPolygonF

self.sigViewportAreaChanged.emit(rect)


查看完整回答
反对 回复 2023-03-01
  • 2 回答
  • 0 关注
  • 797 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号