2012-05-04 48 views
19

Tôi muốn vẽ đa giác trong một số QGraphicsScene nhưng nơi các đa giác có vị trí vĩ độ/kinh độ. Trong một dự báo equirectangular tọa độ đi từ:Cách đặt QGraphicsScene/Xem thành một hệ tọa độ cụ thể

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

Làm thế nào tôi có thể thiết lập QGraphicsScene/QGraphicsView để chiếu như vậy?

Rất cám ơn,

Carlos.

Trả lời

18

Sử dụng QGraphicsScene::setSceneRect() như vậy:

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

Nếu bạn lo ngại về trục dọc được lật không đúng cách, bạn có một vài lựa chọn cho làm thế nào để đối phó với điều này. Một cách đơn giản là nhân với -1 bất cứ khi nào bạn thực hiện bất kỳ phép tính nào liên quan đến toạ độ y. Một cách khác là lật dọc QGraphicsView, sử dụng view->scale(1, -1) để cảnh hiển thị chính xác.

Dưới đây là ví dụ hoạt động sử dụng kỹ thuật sau. Trong ví dụ này, tôi đã phân lớp QGraphicsScene để bạn có thể nhấp vào trong khung nhìn, và cảnh tùy chỉnh sẽ hiển thị vị trí bấm bằng cách sử dụng qDebug(). Trong thực tế, bạn không thực sự cần phải phân lớp 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

Tuyệt vời. Chỉ một câu hỏi: Tại sao 360? – QLands

+0

@QLands 360 là chiều rộng chứ không phải tọa độ phù hợp. Để đi từ -180 đến 180, chiều rộng là 360. – Anthony

+0

Có, thường chúng làm điểm x, điểm y, kích thước x và kích thước y – Lefsler