繁体   English   中英

PyQt:试图理解图形场景/视图

[英]PyQt: Trying to understand graphics scene/view

我正在尝试理解QGraphicsView和QGraphicsScene,特别是如何放置图形项目并将它们显示在我想要的位置。 如果场景大于观看区域,我也会在滚动条出现时感到困惑。

例如,这段代码将在顶角创建一个带有椭圆的小图形视图:

import sys
from PyQt4 import QtGui, QtCore

class MyView(QtGui.QGraphicsView):
    def __init__(self):
        QtGui.QGraphicsView.__init__(self)

        self.scene = QtGui.QGraphicsScene(self)
        self.scene.setSceneRect(QtCore.QRectF(0, 0, 245, 245))

        self.setScene(self.scene)

        self.item = QtGui.QGraphicsEllipseItem(0, 0, 60, 40)
        self.scene.addItem(self.item)


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    view = MyView()
    view.show()
    sys.exit(app.exec_())

但是,如果self.scene.setSceneRect(QtCore.QRectF(0, 0, 245, 245)) ,则即使椭圆具有x,y = 0,0,椭圆也会出现在窗口的中间。 我不知道为什么! 这种行为有原因吗?

同样,当场景大小大于视图时,我对滚动条的外观感到困惑。 例如,以下代码创建具有多个椭圆的视图/场景,而itemsBoundingRect大于sceneRect 仅显示了一些省略号,但没有滚动条可以看到隐藏的省略号,您必须增加窗口的大小。 但是当你这样做时,椭圆的位置会发生偏移,因此忽略椭圆的x,y。

import sys
from PyQt4 import QtGui, QtCore

class MyView(QtGui.QGraphicsView):
    def __init__(self):
        QtGui.QGraphicsView.__init__(self)

        self.setGeometry(QtCore.QRect(100, 100, 250, 250))

        self.scene = QtGui.QGraphicsScene(self)
        self.scene.setSceneRect(QtCore.QRectF(0, 0, 200, 200))

        self.setScene(self.scene)

        for i in range(5):
            self.item = QtGui.QGraphicsEllipseItem(i*75, 10, 60, 40)
            self.scene.addItem(self.item)


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    view = MyView()
    view.show()
    sys.exit(app.exec_())

如果self.scene.setSceneRect(QtCore.QRectF(0, 0, 200, 200))行,则会出现滚动条。 但同样,椭圆的x,y位置被忽略,它们在视图中居中。

我要做的是:创建一个视图,其中项目到达我想要的位置,如果项目数导致场景大于视图大小,则滚动条出现但是对于x,y位置要维护的对象。

我觉得我错过了一些重要的视图/场景拼图......

从文件

如果未设置场景rect,PySide.QtGui.QGraphicsScene将使用PySide.QtGui.QGraphicsScene.itemsBoundingRect()返回的所有>项的边界区域作为场景rect。

因此,它将图像的矩形设置为场景矩形,场景的中心是窗口小部件的中心。

当场景rect大于小部件大小时,将出现滚动条。 当您注释掉setSceneRect行时,您的场景会自动调整大小,但是当您拥有该行时,您的图像将被添加到scenRect的边界scenRect因此您必须更新sceneRect以显示它。

import sys 
from PyQt4 import QtGui, QtCore

class MyView(QtGui.QGraphicsView):
    def __init__(self):
        QtGui.QGraphicsView.__init__(self)

        self.setGeometry(QtCore.QRect(100, 100, 600, 250))

        self.scene = QtGui.QGraphicsScene(self)
        self.scene.setSceneRect(QtCore.QRectF())

        self.setScene(self.scene)

        for i in range(5):
            self.item = QtGui.QGraphicsEllipseItem(i*75, 10, 60, 40)
            self.scene.addItem(self.item)


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    view = MyView()
    view.show()
    sys.exit(app.exec_())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM