QGraphcisView.fitInView缩小场景
QGraphcisView.fitInView shrinks scene
我想了解 QGraphicsView.fitInView
的行为,但我觉得这很奇怪。我有以下最小示例代码
import sys
from PyQt5.QtGui import QPen
from PyQt5.QtCore import Qt, QLineF
from PyQt5.QtWidgets import QGraphicsView, QGraphicsScene, QWidget, QApplication
class MyGraphicsScene(QGraphicsScene):
def __init__(self, parent=None):
super().__init__(parent=parent)
self.setSceneRect(0, 0, 250, 500)
pen = QPen(Qt.black, 1, Qt.DashLine)
pen.setCosmetic(True)
self.addLine(QLineF(self.sceneRect().topLeft(), self.sceneRect().topRight()), pen)
self.addLine(QLineF(self.sceneRect().bottomLeft(), self.sceneRect().bottomRight()), pen)
self.addLine(QLineF(self.sceneRect().topLeft(), self.sceneRect().bottomLeft()), pen)
self.addLine(QLineF(self.sceneRect().topRight(), self.sceneRect().bottomRight()), pen)
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.view = QGraphicsView(self)
self.view.setGeometry(0, 0, 300, 300)
self.scene = MyGraphicsScene()
self.view.setScene(self.scene)
self.view.fitInView(self.scene.sceneRect(), Qt.KeepAspectRatio)
app = QApplication(sys.argv)
window = MyWidget()
window.show()
sys.exit(app.exec_())
现在,我想要实现的是,我可以将场景矩形设置为任何我想要的,然后调用QGraphicsView.fitInView
适当放大或缩放场景,使其覆盖整个图形视图。在这个简单的示例中,我希望代码在整个图形视图中放大到我绘制的矩形(它只是场景边界框)。所以顶部和底部边缘应该接触图形视图的边界。然而,这就是我得到的
特别奇怪的是,如果我不调用 fitInView
,那么我绘制的框将比图形视图大,并且会强制使用垂直滚动条。
我的问题有两个:
- 为什么会这样?显然,我不理解
fitInView
和 的行为
- 我怎样才能实现我想要的行为,即适当地缩放图形 scene/view 以便矩形将到达图形视图的边缘?
问题是因为QGraphicsView还没有渲染出来,所以这个方法失败了。解决方法是在显示后立即执行它:
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.view = QGraphicsView(self)
self.view.setGeometry(0, 0, 300, 300)
self.scene = MyGraphicsScene()
self.view.setScene(self.scene)
QTimer.singleShot(0, self.handle_timeout)
def handle_timeout(self):
self.view.fitInView(self.scene.sceneRect(), Qt.KeepAspectRatio)
我想了解 QGraphicsView.fitInView
的行为,但我觉得这很奇怪。我有以下最小示例代码
import sys
from PyQt5.QtGui import QPen
from PyQt5.QtCore import Qt, QLineF
from PyQt5.QtWidgets import QGraphicsView, QGraphicsScene, QWidget, QApplication
class MyGraphicsScene(QGraphicsScene):
def __init__(self, parent=None):
super().__init__(parent=parent)
self.setSceneRect(0, 0, 250, 500)
pen = QPen(Qt.black, 1, Qt.DashLine)
pen.setCosmetic(True)
self.addLine(QLineF(self.sceneRect().topLeft(), self.sceneRect().topRight()), pen)
self.addLine(QLineF(self.sceneRect().bottomLeft(), self.sceneRect().bottomRight()), pen)
self.addLine(QLineF(self.sceneRect().topLeft(), self.sceneRect().bottomLeft()), pen)
self.addLine(QLineF(self.sceneRect().topRight(), self.sceneRect().bottomRight()), pen)
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.view = QGraphicsView(self)
self.view.setGeometry(0, 0, 300, 300)
self.scene = MyGraphicsScene()
self.view.setScene(self.scene)
self.view.fitInView(self.scene.sceneRect(), Qt.KeepAspectRatio)
app = QApplication(sys.argv)
window = MyWidget()
window.show()
sys.exit(app.exec_())
现在,我想要实现的是,我可以将场景矩形设置为任何我想要的,然后调用QGraphicsView.fitInView
适当放大或缩放场景,使其覆盖整个图形视图。在这个简单的示例中,我希望代码在整个图形视图中放大到我绘制的矩形(它只是场景边界框)。所以顶部和底部边缘应该接触图形视图的边界。然而,这就是我得到的
特别奇怪的是,如果我不调用 fitInView
,那么我绘制的框将比图形视图大,并且会强制使用垂直滚动条。
我的问题有两个:
- 为什么会这样?显然,我不理解
fitInView
和 的行为
- 我怎样才能实现我想要的行为,即适当地缩放图形 scene/view 以便矩形将到达图形视图的边缘?
问题是因为QGraphicsView还没有渲染出来,所以这个方法失败了。解决方法是在显示后立即执行它:
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.view = QGraphicsView(self)
self.view.setGeometry(0, 0, 300, 300)
self.scene = MyGraphicsScene()
self.view.setScene(self.scene)
QTimer.singleShot(0, self.handle_timeout)
def handle_timeout(self):
self.view.fitInView(self.scene.sceneRect(), Qt.KeepAspectRatio)