PyQt5:我无法理解QGraphicsScene的setSceneRect(x,y,w,h)

问题描述 投票:1回答:1

我看到有人说你想把QGraphicsScene的坐标原点放在QGraphicsView的原点,即左上角。您需要让它们都具有相同的大小。

所以这就是我的所作所为:

import sys
from PyQt5.QtWidgets import QApplication, QGraphicsLineItem, 
QGraphicsScene, QGraphicsView


class Demo(QGraphicsView):
    def __init__(self):
        super(Demo, self).__init__()
        self.resize(300, 300)

        self.line = QGraphicsLineItem()
        self.line.setLine(0, 0, 100, 100)

        self.scene = QGraphicsScene()
        self.scene.setSceneRect(0, 0, 300, 300)
        self.scene.addItem(self.line)

        self.setScene(self.scene)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

View的尺寸为300x300,我使用setSceneRect()来确保Scene的尺寸为300x300。

在这种情况下,场景的原点位于左上角。 enter image description here

然而,当我使用setSceneRect(0, 0, 150, 150)时,起源不在那里,但在(75,75)! enter image description here

为什么?我认为setSceneRect(x, y, w, h)的前两个参数设置坐标原点应该在哪里。当场景小于View时,我们如何确保场景的原点位于左上角?

任何帮助,将不胜感激!

python pyqt pyqt5 qgraphicsscene
1个回答
1
投票

正如docs指出:

alignment:Qt :: Alignment

当整个场景可见时,此属性保持视图中场景的对齐。

如果整个场景在视图中可见(即,没有可见的滚动条),则视图的对齐将决定场景在视图中的呈现位置。例如,如果对齐方式是Qt :: AlignCenter(默认情况下),则场景将在视图中居中,如果对齐方式为(Qt :: AlignLeft | Qt :: AlignTop),则场景将呈现在顶部 - 视角的左侧角落。

因此,默认情况下,scenerect以QGraphicsView的视口为中心,并且在具有相同大小的情况下,会指出您指出的行为,但在第二种情况下,会突出显示居中的属性。

所以解决方案是建立对齐:

import sys
from PyQt5.QtWidgets import QApplication, QGraphicsLineItem, QGraphicsScene, QGraphicsView
from PyQt5.QtCore import Qt

class Demo(QGraphicsView):
    def __init__(self):
        super(Demo, self).__init__()
        self.resize(300, 300)

        self.line = QGraphicsLineItem()
        self.line.setLine(0, 0, 100, 100)

        self.scene = QGraphicsScene()
        self.scene.setSceneRect(0, 0, 150, 150)
        self.scene.addItem(self.line)

        self.setScene(self.scene)
        self.setAlignment(Qt.AlignTop | Qt.AlignLeft)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

enter image description here


说明:

要了解场景最先是什么,必须要理解它是QGraphicsView和QGraphicsScene,这些概念的解释类似于电影的录制,QGraphicsView将是相机,QGraphicsScene代表录制的内容,即现场。场景由sceneRect界定,如果摄像机非常接近场景,则不会观察到其极限,但如果摄像机距离较远,摄像机中的场景投影将不会占据整个屏幕,因此它将具有要在某个位置对齐,在QGraphicsView的情况下,使用alignment属性。


如果我使用setSceneRect(50,50,150,150),为什么场景不再在视图中居中?

要回答我使用以下示例在哪里使scenerect可见我使用QGraphicsRectItem:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class Demo(QtWidgets.QGraphicsView):
    def __init__(self):
        super(Demo, self).__init__()
        self.resize(300, 300)

        self.line = QtWidgets.QGraphicsLineItem()
        self.line.setLine(0, 0, 100, 100)

        self.scene = QtWidgets.QGraphicsScene()
        self.scene.setSceneRect(50, 50, 150, 150)
        self.scene.addItem(self.line)
        rect_item = self.scene.addRect(QtCore.QRectF(50, 50, 150, 150))
        rect_item.setPen(QtGui.QPen(QtGui.QColor("green")))

        self.setScene(self.scene)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

enter image description here

如您所见,对齐不是关于QRectF(0,0,w,h),而是QRectF(x,y,w,h)的中心,在这种情况下是(100,100)。因此,请继续关注QGraphicsView中的sceneRect。

© www.soinside.com 2019 - 2024. All rights reserved.