Estoy tratando de dar sentido a QGraphicsView y QGraphicsScene, específicamente cómo colocar elementos gráficos y hacer que aparezcan donde yo quiero. También estoy confundido acerca de cuándo aparecerán las barras de desplazamiento si la escena es más grande que el área de visualización.PyQt: tratando de entender la escena/vista de gráficos
Por ejemplo, este fragmento de código creará una pequeña vista gráfica con una elipse en la esquina superior:
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_())
Sin embargo, si se omite el self.scene.setSceneRect(QtCore.QRectF(0, 0, 245, 245))
, entonces la elipse aparece en el medio de la ventana aunque la elipse tenga x, y = 0,0. ¡No estoy seguro por qué! ¿Hay alguna razón para este comportamiento?
Del mismo modo, estoy confundido acerca de la apariencia de las barras de desplazamiento cuando el tamaño de la escena es mayor que la vista. Por ejemplo, el siguiente código crea una vista/escena con varias elipses, y el itemsBoundingRect
es más grande que el sceneRect
. Solo se muestran algunas de las elipses, pero no hay una barra de desplazamiento para ver las ocultas, debe aumentar el tamaño de la ventana. Pero cuando haces eso, la ubicación de las elipsis cambia, por lo que se ignoran las x, y de las elipses.
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_())
Si se omite la línea self.scene.setSceneRect(QtCore.QRectF(0, 0, 200, 200))
, a continuación, aparece una barra de desplazamiento. Pero, de nuevo, las posiciones x, y de las elipses se ignoran, y se centran en la vista.
Lo que trato de hacer es: crear una vista donde los elementos van donde yo los quiero, y si el número de elementos hace que la escena sea más grande que el tamaño de la vista, para que aparezcan las barras de desplazamiento pero para la x, y las posiciones de los objetos que se mantendrán.
siento que me falta alguna pieza importante del rompecabezas ver/escena ...
Gracias @Jeff. Me he dado cuenta de que la llamada 'setGeometry' también juega un papel cuando aparecen las barras de desplazamiento. En el segundo ejemplo, las barras de desplazamiento aparecen cuando se llama a 'setGeometry' pero' setSceneRect' se llama _not_. Naturalmente, si no se llama a ninguno, la vista se ajusta automáticamente para ajustarse a todos los elementos (se ajusta a 'itemsBoundingRect'). Si se llaman _both_, entonces solo se muestra la escena definida por 'setSceneRect', sin barras de desplazamiento. – XandYandZ