PyQt: попытка понять графическую сцену / представление

Я пытаюсь понять 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 объекты, подлежащие обслуживанию.

Я чувствую, что упускаю какую-то важную часть головоломки вида / сцены ...


person XandYandZ    schedule 29.02.2012    source источник
comment
За первые Q-слова проголосовали: Я пытаюсь разобраться :) :) :)   -  person amotzg    schedule 25.06.2019


Ответы (1)


Из документа

Если прямоугольник сцены не задан, PySide.QtGui.QGraphicsScene будет использовать ограничивающую область всех> элементов, возвращенных PySide.QtGui.QGraphicsScene.itemsBoundingRect (), как прямоугольник сцены.

Таким образом, он устанавливает прямоугольник вашего изображения как прямоугольник сцены, а центр сцены является центром виджета.

Полосы прокрутки появятся, когда прямоугольник сцены больше размера виджета. Когда вы закомментируете строку setSceneRect, размер вашей сцены изменяется автоматически, но когда у вас есть строка, ваши изображения добавляются за пределы scenRect, поэтому вам придется обновить sceneRect, чтобы отобразить ее.

person Jeff    schedule 29.02.2012
comment
Спасибо, @Jeff. Я заметил, что вызов setGeometry также играет роль при появлении полос прокрутки. Во втором примере полосы прокрутки появляются, когда setGeometry вызывается, но setSceneRect не вызывается. Естественно, если ни один из них не вызывается, вид автоматически настраивается, чтобы вместить все элементы (соответствует itemsBoundingRect). Если вызываются оба, то отображается только сцена, определенная setSceneRect, без полос прокрутки. - person XandYandZ; 01.03.2012