2016-08-02 17 views
0

Ich habe einige Skalierungsprobleme - ich vermute, dass ich etwas vermisse ... vielleicht könnte mich jemand gerade setzen.Echte Welt Maßstab Probleme mit QGraphicsView/QGraphicsItem

Ich benutze eine QGraphicsScene und QGraphicsView, um die Position eines Bootes unter Verwendung von Längen- und Breitengrad in Dezimalgraden anzuzeigen. Für die un initiierte sieht die Positionen wie folgt aus:

LON: -71,34253 LAT: 41,549886

Dies sind die Positionen, die ich für meine benutzerdefinierte QGraphicsItem Objekte setze. Dies sind "echte" Koordinaten.

Meine Probleme sind, dass ich meine Objekte nicht richtig anzeigen kann, und ich vermute, dass ich die Skala nicht verstehe, die ich verwenden sollte, wenn ich meine paint() -Funktion zeichne.

Ich verwende Qt über PyQt, aber das sollte das gleiche sein, nein? Hier ist meine benutzerdefinierte Klasse, die eine Position darstellt.

class myGraphicsFix(QGraphicsItem): 

    def __init__(self): 
      super().__init__() 

      self.lat = 0.0 
      self.lon = 0.0 

      self.boatlength = 1.5696e-6 # assuming 6371 km earth diameter, 10 m boat length 

    def setLatLon(self, tlat, tlon): 
      self.lat = tlat 
      self.lon = tlon 
      self.setPos(self.lat, self.lon) 

    def paint(self, painter, option, widget): 
      pen = QPen(Qt.SolidLine) 
      pen.setColor(Qt.black) 
      pen.setWidth(0.0) 
      painter.drawPoint(QPointF(0.0,0.0)) 

    def boundingRect(self): 
      return QRectF(-self.boatlength/2.0,-self.boatlength/2.0, +self.boatlength/2.0, self.boatlength) 

Wenn dieser Code alle laufen I ist ein fester Block von Schwarz zu erhalten, was bedeutet, dass irgendwie sind meine Punkte als riesige Quadrate gezogen werden. Wenn ich drawPoint mit drawEllipse() wie folgt ersetzen:

painter.drawEllipse(-self.boatlength/2.0,-self.boatlength/2.0, self.boatlength, self.boatlength) 

Gar nichts gezogen wird ... Irgendwelche Gedanken?

Tom.

+0

Im ersten Fall erstellen Sie einen Stift der Linienbreite 0 und verwenden ihn nicht. Wie bekommst du etwas? Im zweiten Fall zeichnen Sie eine Ellipse eines sehr kleinen Radius mit großem Koordinatenzentrum. Wie versuchst du es zu finden? – ilotXXI

+0

Danke tilotXXI. Der Stift in meinem ersten Fall war ein Rest von dem Code drawEllipse da drin. Sie haben Recht, dass der Code drawEllipse komisch ist - ich habe ihn auf 0,0 und die halbe Bootslänge für X- und Y-Radien geändert, aber ich bekomme immer noch das Gleiche. Meine Frage ist wirklich, was sollte ich für einen Radius verwenden? Reale Weltkoordinaten? –

Antwort

1

Glad meine eigene Frage zu beantworten ...

Ja, die Skala in der QGraphicsItem verwendet wird, ist die „reale Welt“ Skala.

Das Problem, das ich hatte, war, dass ich die Funktion drawEllipse nicht richtig aufruft. Hier ist der aufgeräumte Code, der funktioniert. Notieren Sie das QPointF() - Objekt in dem Argument.

def paint(self, painter, option, widget): 
      pen = QPen() 
      pen.setWidth(0) 
      painter.setPen(pen) 
      painter.drawEllipse(QPointF(0.0,0.0), +self.boatlength/2.0, self.boatlength/2.0) 

Beachten Sie, dass in der __init__() Methode, die ich self.boatlength = 0.00001 haben, die in der „realen Welt“ Einheiten (hier Dezimalgraden auf der Oberfläche der Erde) mit dem Boot entspricht.

Die Dinge funktionieren jetzt wie ein Charme.