Я пытаюсь понять 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 позиции объектов, которые будут поддерживаться.
Мне кажется, что мне не хватает какой-то важной части головоломки вида/сцены...