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

2024-05-15 08:27:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解QGraphicsView和qgraphicscene,特别是如何放置图形项并让它们显示在我想要的位置。如果场景大于查看区域,滚动条将在何时出现,我也很困惑。

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

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位置。

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


Tags: importself视图initsys场景sceneitem
2条回答
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_())

从文件中

If the scene rect is unset, PySide.QtGui.QGraphicsScene will use the bounding area of all >items, as returned by PySide.QtGui.QGraphicsScene.itemsBoundingRect() , as the scene rect.

所以它将图像的矩形设置为场景的矩形,场景的中心是小部件的中心。

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

相关问题 更多 >