2016-08-02 1 views
0

J'ai quelques problèmes de mise à l'échelle - je soupçonne qu'il me manque quelque chose ... peut-être que quelqu'un pourrait me redresser. J'utilise un QGraphicsScene et QGraphicsView pour afficher la position d'un bateau en utilisant la latitude et la longitude en degrés décimaux. Pour les positions de l'ONU à l'initiative ressemble à ceci:Problèmes d'échelle du monde réel avec QGraphicsView/QGraphicsItem

LON: -71,34253 LAT: 41,549886

Ce sont les positions que je suis en train de mes objets QGraphicsItem personnalisés. Ce sont des coordonnées "du monde réel". Mes problèmes sont que je n'arrive pas à afficher correctement mes objets et je suppose que je ne comprends pas l'échelle que je devrais utiliser quand je dessine dans ma fonction paint(). J'utilise Qt via PyQt, mais ce devrait être pareil, non? Voici ma classe personnalisée qui représente une position.

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) 

Lorsque ce code est exécuté tout ce que je reçois est un bloc solide de noir, ce qui implique que en quelque sorte mes points sont dessinés sous forme de carrés géants. Si je remplace drawPoint avec drawEllipse() comme suit:

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

Rien ne se dessine du tout ... Des pensées?

Tom.

+0

Dans le premier cas, vous créez un stylo de largeur de ligne 0 et ne l'utilisez pas. Comment obtenez-vous quelque chose? Dans le second cas, vous dessinez une ellipse d'un très petit rayon avec un grand centre de coordonnées. Comment essayez-vous de le trouver? – ilotXXI

+0

Merci ilotXXI. Le stylo dans mon premier cas était un reste d'avoir le code drawEllipse là-bas. Vous avez raison: le code drawEllipse est bizarre - je l'ai changé pour avoir 0,0, et la moitié de la longueur du bateau pour les rayons X et Y mais je reçois toujours la même chose. Ma question est vraiment ce que je devrais utiliser pour un rayon? Les coordonnées du monde réel? –

Répondre

1

Je suis heureux de répondre à ma propre question ...

Oui, l'échelle à utiliser dans le QGraphicsItem est l'échelle « monde réel ». Le problème que je rencontrais était que je n'appelais pas la fonction drawEllipse correctement. Voici le code nettoyé qui fonctionne. Notez l'objet QPointF() dans l'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) 

Notez que dans la méthode __init__() je self.boatlength = 0.00001 qui correspond au bateau en unités « monde réel » (Ici degrés décimaux sur la surface de la terre).

Les choses fonctionnent maintenant comme un charme.