亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 562 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號