2012-02-29 21 views
8

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 ...

Respuesta

3

Del documento

Si la escena rect no está definida, PySide.QtGui.QGraphicsScene utilizará el área delimitadora de todos los elementos>, devuelta por PySide.QtGui.QGraphicsScene.itemsBoundingRect(), como la escena rect.

Así que está configurando la rect de su imagen como su escena recta y el centro de la escena es el centro del widget.

Las barras de desplazamiento aparecerán cuando la escena rect sea mayor que el tamaño del widget. Cuando comente la línea setSceneRect, su escena se redimensionará automáticamente, pero cuando tenga la línea, las imágenes se agregarán más allá de los límites del scenRect, por lo que tendrá que actualizar su sceneRect para mostrarlo.

+0

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

1
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_()) 
Cuestiones relacionadas