2012-05-04 14 views
19

Quiero dibujar polígonos en un QGraphicsScene pero donde los polígonos tienen posiciones de latitud/longitud. En una proyección cilíndrica equidistante las coordenadas va de:Cómo configurar QGraphicsScene/View a un sistema de coordenadas específico

     ^
         90 
         | 
         | 
-180----------------------------------->180 
         | 
         | 
        -90 

¿Cómo puedo configurar el QGraphicsScene/QGraphicsView a dicha proyección?

Muchas gracias,

Carlos.

Respuesta

18

Uso QGraphicsScene::setSceneRect() así:

scene->setSceneRect(-180, -90, 360, 180); 

Si usted está preocupado por el eje vertical se volcó de forma incorrecta, usted tiene algunas opciones para la forma de lidiar con esto. Una forma es simplemente multiplicar por -1 cada vez que realice cualquier cálculo que implique la coordenada y. Otra forma es voltear verticalmente QGraphicsView, usando view->scale(1, -1) para que la escena se muestre correctamente.

A continuación se muestra un ejemplo de trabajo que utiliza la última técnica. En el ejemplo, he subclasificado QGraphicsScene para que pueda hacer clic en la vista, y la escena personalizada mostrará la posición de clic usando qDebug(). En la práctica, no es necesario que subclasses QGraphicsScene.

#include <QtGui> 

class CustomScene : public QGraphicsScene 
{ 
protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *event) 
    { 
     qDebug() << event->scenePos(); 
    } 
}; 

class MainWindow : public QMainWindow 
{ 
public: 
    MainWindow() 
    { 
     QGraphicsScene *scene = new CustomScene; 
     QGraphicsView *view = new QGraphicsView(this); 
     scene->setSceneRect(-180, -90, 360, 180); 
     view->setScene(scene); 
     view->scale(1, -1); 
     setCentralWidget(view); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 
    return a.exec(); 
} 
+0

Excelente. Solo una pregunta: ¿Por qué 360? – QLands

+0

@QLands 360 es el ancho, no la coordenada derecha. Para ir de -180 a 180, el ancho es 360. – Anthony

+0

Sí, generalmente señalan x, punto y, tamaño xy – Lefsler

Cuestiones relacionadas