zoukankan      html  css  js  c++  java
  • Qt QGraphics类应用——地图缩放选点

    功能:

      1、地图缩放

      2、显示鼠标点经纬度

    需求:

      1、一张地图

      2、地图左上角经纬度和地图右下角经纬度

    成品:

    代码:

    mapwidget.h

    #ifndef MAPWIDGET_H
    #define MAPWIDGET_H
    
    #include <QGraphicsView>
    #include <QLabel>
    #include <QMouseEvent>
    
    class MapWidget : public QGraphicsView
    {
        Q_OBJECT
    public:
        MapWidget();
    
        void readMap();
        QPointF mapToMap(QPointF point);//用于场景坐标与地图坐标转换
    
    protected:
        void drawBackground(QPainter *painter, const QRectF &rect);
        void mouseMoveEvent(QMouseEvent *event);//拖动
        void wheelEvent(QWheelEvent *event);    //缩放
    
    private:
        QPixmap map;
        qreal   zoom;
        QLabel  *sceneCoord,*viewCoord,*mapCoord;
        double  x1,x2,y1,y2;
        int     scaleValue;
    };
    
    #endif // MAPWIDGET_H
    

    mapwidget.cpp

    #include "mapwidget.h"
    #include <QFile>
    #include <QDebug>
    #include <qmath.h>
    #include <QTextStream>
    #include <QGraphicsScene>
    
    #define ZOOM_IN_TIMES -5
    #define ZOOM_OUT_TIMES 5
    MapWidget::MapWidget()
    {
        readMap();
    
        scaleValue = 0;
        int width  = map.width();
        int height = map.height();
        QGraphicsScene *scene = new QGraphicsScene(this);
        scene->setSceneRect( -width/2,-height/2,width,height );//中点和范围
        setScene(scene);
        setCacheMode(CacheBackground);//缓存背景
    
        QLabel *scenelabel = new QLabel(tr("GraphicsScene:"),this);
        QLabel *viewlabel  = new QLabel(tr("GraphicsView: "),this);
        QLabel *maplabel   = new QLabel(tr("Map:          "),this);
    
        sceneCoord = new QLabel(this);
        viewCoord  = new QLabel(this);
        mapCoord   = new QLabel(this);
    
        scenelabel->setGeometry(1,1,110,20);
        viewlabel->setGeometry(1,21,110,20);
        maplabel->setGeometry(1,41,110,20);
        sceneCoord->setGeometry(111,1,200,20);
        viewCoord->setGeometry(111,21,200,20);
        mapCoord->setGeometry(111,41,200,20);
    
    
    
    }
    
    
    void MapWidget::readMap()
    {
        QString mapName;
        QFile mapFile(":/file/maps.txt");
        int ok = mapFile.open(QIODevice::ReadOnly | QIODevice::Text);
        qDebug()<<"ok="<<ok;
        if(ok)
        {
            QTextStream in(&mapFile);
            if(!in.atEnd())
            {
                in>>mapName;
                in>>x1>>y1>>x2>>y2;
            }
        }
        mapFile.close();
        map.load(":/image/China.jpg");
        qDebug()<<"mapName="<<mapName<<" x1="<<x1<<" y1="<<y1<<" x2="<<x2<<" y2="<<y2;
    }
    
    QPointF MapWidget::mapToMap(QPointF point)//场景坐标到地图坐标
    {
        QPointF lonlat;
        qreal w = sceneRect().width();
        qreal h = sceneRect().height();
    
        qreal lon = x1+( (w/2+point.x())*qAbs(x1-x2)/w );
        qreal lat = y1-( (h/2+point.y())*qAbs(y1-y2)/h );
    
        lonlat.setX(lon);
        lonlat.setY(lat);
        return lonlat;
    }
    
    void MapWidget::drawBackground(QPainter *painter, const QRectF &rect)
    {
        painter->drawPixmap( (int)sceneRect().left(),(int)sceneRect().top(),map );
    }
    
    void MapWidget::wheelEvent(QWheelEvent *event)
    {
        qreal s=0;
        bool in = true;
        bool out = true;
    
    
        if(event->delta() >= 0)//delta返回滑动的距离
        {
            scaleValue += 1;
        }
        if(event->delta() < 0)//delta返回滑动的距离
        {
            scaleValue -= 1;
        }
    
        if( scaleValue < ZOOM_IN_TIMES )
        {
            scaleValue = ZOOM_IN_TIMES;
            in = false;
            return;
        }else if( scaleValue > ZOOM_OUT_TIMES )
        {
            scaleValue = ZOOM_OUT_TIMES;
            out = false;
            return;
        }
    
    
        if(in)
        {
            s = qPow(1.01,event->delta()/10);
        }
        if(out)
        {
            s = qPow(1/1.01,-event->delta()/10);
        }
        qDebug()<<"scaleValue="<<scaleValue;
        scale(s,s);
    }
    
    void MapWidget::mouseMoveEvent(QMouseEvent *event)
    {
        //1.而由event->globalPos()获取的鼠标位置是鼠标偏离电脑屏幕左上角
        //(x=0,y=0)的位置;
        //2.由pos()获取的位置是主窗口(widget窗口)左上角(边框的左上角,外左上
        //角)相对于电脑屏幕的左上角的(x=0,y=0)偏移位置
        //视图坐标
        QPoint viewPoint = event->pos();
        viewCoord->setText( QString::number(viewPoint.x())+","+
                            QString::number(viewPoint.y()) );
        //场景坐标
        QPointF scenePoint = mapToScene(viewPoint);
        sceneCoord->setText( QString::number(scenePoint.x())+","+
                            QString::number(scenePoint.y()) );
        //地图坐标
        QPointF mapPoint = mapToMap(scenePoint);
        mapCoord->setText( QString::number(mapPoint.x(),10,7)+","+
                            QString::number(mapPoint.y(),10,7) );
    
    
    }
    

    main.cpp

    #include "mapwidget.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MapWidget map;
        map.show();
        
        return a.exec();
    }
    

    map.txt

    :/image/China.jpg 114.4665527 35.96022297 119.9597168 31.3911575
    

      

      

  • 相关阅读:
    java 异常捕获机制
    读取java当前路径的文件输出在控制台
    java 简易记事本 程序
    java 利用文件输入输出流实现文件复制
    IutputStreamWriterDemo
    OutputStreamWriterDemo
    Longest Substring Without Repeat Characters
    Add Two Numbers
    Two Sum
    使用 Canvas 绘图
  • 原文地址:https://www.cnblogs.com/shuoguoleilei/p/12020810.html
Copyright © 2011-2022 走看看