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