如何将QGraphicsScene/View设置为特定的坐标系

QLa*_*nds 20 qt projection qgraphicsview qgraphicsscene

我想在多边形中绘制多边形QGraphicsScene但多边形具有纬度/经度位置.在一个equirectangular投影中,坐标来自:

                       ^
                      90
                       |
                       |
-180----------------------------------->180
                       |
                       |
                     -90
Run Code Online (Sandbox Code Playgroud)

如何设置QGraphicsScene/ QGraphicsView到这样的投影?

非常感谢,

卡洛斯.

Ant*_*ony 20

使用QGraphicsScene::setSceneRect()如下:

scene->setSceneRect(-180, -90, 360, 180);
Run Code Online (Sandbox Code Playgroud)

如果您担心垂直轴被错误翻转,您可以选择如何处理此问题.一种方法是,只要进行涉及y坐标的任何计算,就简单地乘以-1.另一种方法是垂直翻转QGraphicsView,view->scale(1, -1)以便正确显示场景.

下面是一个使用后一种技术的工作示例.在示例中,我已经将QGraphicsScene子类化,以便您可以在视图中单击,并且自定义场景将使用显示单击位置qDebug().实际上,您实际上并不需要继承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();
}
Run Code Online (Sandbox Code Playgroud)

  • 注意:用缩放(1,-1)翻转y也会翻转文字! (2认同)