2012-02-29 11 views
8

Sto cercando di dare un senso a QGraphicsView e QGraphicsScene, in particolare come posizionare gli elementi grafici e farli apparire dove voglio. Sono anche confuso su quando verranno visualizzate le barre di scorrimento se la scena è più grande dell'area di visualizzazione.PyQt: Cercando di capire la scena/vista grafica

Ad esempio, questo pezzo di codice creerà una piccola grafici view con un'ellisse in alto:

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_()) 

Tuttavia, se il self.scene.setSceneRect(QtCore.QRectF(0, 0, 245, 245)) è omesso, quindi l'ellisse appare in mezzo la finestra anche se l'ellisse ha x, y = 0,0. Non sono sicuro del perché! C'è una ragione per questo comportamento?

Allo stesso modo, sono confuso circa l'aspetto delle barre di scorrimento quando la dimensione della scena è maggiore della vista. Ad esempio, il codice seguente crea una vista/scena con diverse ellissi e lo itemsBoundingRect è più grande dello sceneRect. Solo alcune delle ellissi sono mostrate, ma non c'è una barra di scorrimento per vedere quelle nascoste, devi aumentare la dimensione della finestra. Ma quando lo fai, la posizione degli ellissi si sposta, quindi la x, y delle ellissi viene ignorata.

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_()) 

Se la linea self.scene.setSceneRect(QtCore.QRectF(0, 0, 200, 200)) viene omesso, quindi appare una barra di scorrimento. Ma ancora, le posizioni x, y delle ellissi vengono ignorate e sono centrate nella vista.

Quello che sto cercando di fare è: creare una vista dove gli oggetti vanno dove li voglio, e se il numero di elementi fa sì che la scena sia più grande della dimensione della vista, per far apparire le barre di scorrimento ma per la x, y posizioni degli oggetti da mantenere.

Mi sento come se mi manca qualche pezzo importante del puzzle vista/scena ...

risposta

3

Dal documento

Se il rettangolo scena è impostata, PySide.QtGui.QGraphicsScene userà l'area di delimitazione di tutti gli elementi> restituiti da PySide.QtGui.QGraphicsScene.itemsBoundingRect(), come scena rect.

Così si imposta il retto dell'immagine come scena retta e il centro della scena è il centro del widget.

Le barre di scorrimento vengono visualizzate quando il valore di scena è maggiore della dimensione del widget. Quando commentate la linea setSceneRect la vostra scena viene ridimensionata automaticamente, ma quando avete la linea le vostre immagini vengono aggiunte oltre i limiti del scenRect quindi dovrete aggiornare il vostro sceneRect per mostrarlo.

+0

Grazie a @Jeff. Ho notato che anche la chiamata 'setGeometry' ha un ruolo in quando appaiono le barre di scorrimento. Nel secondo esempio, le barre di scorrimento appaiono quando viene chiamato 'setGeometry', ma' setSceneRect' non è chiamato __not_. Naturalmente, se nessuno dei due viene chiamato, la vista si regola automaticamente per adattarsi a tutti gli elementi (conforme a 'itemsBoundingRect'). Se _both_ vengono chiamati, viene mostrata solo la scena definita da 'setSceneRect', senza barre di scorrimento. – 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_())