您的位置:首页 > 编程语言 > Qt开发

QT地图浏览器的编写(QGraphicsView图形视图的使用)

2020-04-21 22:59 1056 查看

QT地图浏览器的编写(QGraphicsView图形视图的使用)

  • 效果展示
  • 程序

    新建函数继承自QGraphicsView类

    QGraphicsView图形视图的使用

    .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);//获得地图的经纬度
    public slots:
    void slotZoom(int);//使用滚轴对地图缩放
    protected:
    void drawBackground(QPainter*painter,const QRectF &rect);//绘制地图
    void mouseMoveEvent(QMouseEvent *event);//重写鼠标移动事件
    private:
    QPixmap map;
    qreal zoom;
    QLabel *viewCoord;
    QLabel *sceneCoord;
    QLabel *mapCoord;
    double x1,y1;
    double x2,y2;
    };
    
    #endif // MAPWIDGET_H

    新建maps.txt描述与地图相关的信息China.jpg 114.4665527 35.96022297 119.9597168 31.3911575

    .cpp
    #include "mapwidget.h"
    #include <QSlider>
    #include <QGridLayout>
    #include <QVBoxLayout>
    #include <QHBoxLayout>
    #include <QTextStream>
    
    MapWidget::MapWidget()
    {
    readMap();
    zoom=50;
    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);
    QSlider *slider =new QSlider;//新建一个滚动条控制地图的缩放
    slider->setOrientation(Qt::Vertical);//垂直滚动条
    slider->setRange(1,100);//缩放范围为1~100
    slider->setTickInterval(10);//设置滑动间隔
    slider->setValue(50);//设置初始值为50
    connect(slider,SIGNAL(valueChanged(int)),this,SLOT(slotZoom(int)));
    QLabel *zoominLabel=new QLabel;
    zoominLabel->setScaledContents(true);
    zoominLabel->setPixmap(QPixmap("zoomin.png"));
    QLabel *zoomoutLabel=new QLabel;
    zoomoutLabel->setScaledContents(true);
    zoomoutLabel->setPixmap(QPixmap("zoomout.png"));
    QLabel *label1=new QLabel("GraphicsView:");
    viewCoord=new QLabel;
    QLabel *label2=new QLabel("GraphicsScene:");
    sceneCoord=new QLabel;
    QLabel *label3= new QLabel("map:");
    mapCoord= new QLabel;
    QGridLayout *gridLayout =new QGridLayout;
    gridLayout->addWidget(label1,0,0);
    gridLayout->addWidget(viewCoord,0,1);
    gridLayout->addWidget(label2,1,0);
    gridLayout->addWidget(sceneCoord,1,1);
    gridLayout->addWidget(label3,2,0);
    gridLayout->addWidget(mapCoord,2,1);
    gridLayout->setSizeConstraint(QLayout::SetFixedSize);//固定尺寸
    QFrame *coordFrame=new QFrame;
    coordFrame->setLayout(gridLayout);
    QVBoxLayout *zoomLayout=new QVBoxLayout;
    zoomLayout->addWidget(zoominLabel);
    zoomLayout->addWidget(slider);
    zoomLayout->addWidget(zoomoutLabel);
    QVBoxLayout *coordLayout =new QVBoxLayout;
    coordLayout->addWidget(coordFrame);
    coordLayout->addStretch();
    QHBoxLayout *mainLayout=new QHBoxLayout;
    mainLayout->addLayout(zoomLayout);
    mainLayout->addLayout(coordLayout);
    mainLayout->addStretch();
    mainLayout->setMargin(30);
    mainLayout->setSpacing(10);
    setLayout(mainLayout);
    setWindowTitle("Map Widget");
    setMinimumSize(600,400);
    }
    
    void MapWidget::readMap()
    {
    QString mapName;
    QFile mapFile("maps.txt");
    int ok= mapFile.open(QIODevice::ReadOnly);
    if(ok)
    {
    QTextStream ts(&mapFile);
    if(!ts.atEnd())
    {
    ts>>mapName;
    ts>>x1>>y1>>x2>>y2;
    }
    }
    map.load(mapName);
    
    }
    
    QPointF MapWidget::mapToMap(QPointF p)
    {
    QPointF latLon;
    qreal w =sceneRect().width();
    qreal h =sceneRect().height();
    qreal lon =y1-((h/2+p.y())*abs(y1-y2)/h);
    qreal lat =x1-((w/2+p.x())*abs(x1-x2)/w);
    latLon.setX(lat);
    latLon.setY(lon);
    return latLon;
    }
    
    void MapWidget::slotZoom(int value)
    {
    qreal s;
    if(value>zoom)
    {
    s=pow(1.01,(value-zoom));
    }
    else
    {
    s=pow(1/1.01,(zoom-value));
    }
    scale(s,s);//缩放功能
    zoom=value;
    }
    
    void MapWidget::drawBackground(QPainter *painter, const QRectF &rect)
    {
    painter->drawPixmap(int(sceneRect().left()),int(sceneRect().top()),map);
    }
    
    void MapWidget::mouseMoveEvent(QMouseEvent *event)
    {
    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 latLon=mapToMap(scenePoint);//获得地图经纬度
    mapCoord->setText(QString::number(latLon.x())+","+QString::number(latLon.y()));
    }

    main函数(字体的设置和视图的显示)

    main.cpp
    #include "mainwindow.h"
    #include <QApplication>
    #include <QFont>
    #include "mapwidget.h"
    
    int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);
    QFont font("ARPL KaitiM GB",12);
    font.setBold(true);
    a.setFont(font);
    MapWidget*mapwidget=new MapWidget;
    mapwidget->show();
    //MainWindow w;
    //w.show();
    
    return a.exec();
    }

    效果展示

    没有找的适合的地图,所以没有插入地图图片,无法获得经纬度,只获得视图和场景的坐标

    • 点赞
    • 收藏
    • 分享
    • 文章举报
    康立志 发布了38 篇原创文章 · 获赞 3 · 访问量 754 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: