我正在努力理解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位置。
我觉得我错过了视图/场景拼图中的一些重要部分。。。
从文档
如果场景矩形未设置,PySide.QtGui.QGraphicsScene将使用PySide.Q tGui.Q GraphicsScene.itemsBoundingRect()返回的所有>项的边界区域作为场景矩形。
因此,它将图像的矩形设置为场景矩形,而场景的中心就是小部件的中心。
当场景矩形大于小部件大小时,滚动条将出现。当你注释掉setSceneRect
行时,你的场景会自动调整大小,但当你有行时,图像会被添加到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_())