找回密码
 立即注册
收起左侧

地图,坐标读取不进程序么?

5
回复
7479
查看
[复制链接]
累计签到:1 天
连续签到:1 天
来源: 2017-3-30 16:12:57 显示全部楼层 |阅读模式
1Qter豆
#include "mapwidget.h"#include <QSlider>#include <QGridLayout>#include <QFile>#include <QTextStream>#include <QGraphicsScene>#include <math.h>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);    slider->setTickInterval(10);    slider->setValue(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(tr("GraphicsView:"));    viewCoord = new QLabel;    QLabel *label2 = new QLabel(tr("GraphicsScene:"));    sceneCoord = new QLabel;    QLabel *label3 = new QLabel(tr("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);}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){    //QGraphicsView 坐标    QPoint viewPoint = event->pos();    viewCoord->setText(QString::number(viewPoint.x())+","+QString::number(viewPoint.y()));    //QGraphicsScene 坐标    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()));}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;}地图文件显示不了,maps.txt好像也读不进来。。怎麼回事呢?

附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册
回复

使用道具 举报

累计签到:45 天
连续签到:1 天
2017-3-30 17:31:12 显示全部楼层
码真特么乱
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2017-3-30 19:52:34 显示全部楼层
  1. #include "mapwidget.h"
  2. #include <QSlider>
  3. #include <QGridLayout>
  4. #include <QFile>
  5. #include <QTextStream>
  6. #include <QGraphicsScene>
  7. #include <math.h>
  8. MapWidget::MapWidget()
  9. {
  10.     readMap();                                        //读取地图信息
  11.     zoom=50;
  12.     int width = map.width();
  13.     int height = map.height();
  14.     QGraphicsScene *scene = new QGraphicsScene(this);
  15.     scene->setSceneRect(-width/2,-height/2,width,height);
  16.     setScene(scene);
  17.     setCacheMode(CacheBackground);
  18.     //用于地图缩放的滑动条
  19.     QSlider *slider = new QSlider;
  20.     slider->setOrientation(Qt::Vertical);
  21.     slider->setRange(1,100);
  22.     slider->setTickInterval(10);
  23.     slider->setValue(50);
  24.     connect(slider,SIGNAL(valueChanged(int)),this,SLOT(slotZoom(int)));
  25.     QLabel *zoominLabel = new QLabel;
  26.     zoominLabel->setScaledContents(true);
  27.     zoominLabel->setPixmap(QPixmap("zoomin.png"));
  28.     QLabel *zoomoutLabel = new QLabel;
  29.     zoomoutLabel->setScaledContents(true);
  30.     zoomoutLabel->setPixmap(QPixmap("zoomout.png"));
  31.     //坐标值显示区
  32.     QLabel *label1 = new QLabel(tr("GraphicsView:"));
  33.     viewCoord = new QLabel;
  34.     QLabel *label2 = new QLabel(tr("GraphicsScene:"));
  35.     sceneCoord = new QLabel;
  36.     QLabel *label3 = new QLabel(tr("map:"));
  37.     mapCoord = new QLabel;
  38.     //坐标显示区布局
  39.     QGridLayout *gridLayout = new QGridLayout;
  40.     gridLayout->addWidget(label1,0,0);
  41.     gridLayout->addWidget(viewCoord,0,1);
  42.     gridLayout->addWidget(label2,1,0);
  43.     gridLayout->addWidget(sceneCoord,1,1);
  44.     gridLayout->addWidget(label3,2,0);
  45.     gridLayout->addWidget(mapCoord,2,1);
  46.     gridLayout->setSizeConstraint(QLayout::SetFixedSize);
  47.     QFrame *coordFrame = new QFrame;
  48.     coordFrame->setLayout(gridLayout);
  49.     //缩放控制子布局
  50.     QVBoxLayout *zoomLayout = new QVBoxLayout;
  51.     zoomLayout->addWidget(zoominLabel);
  52.     zoomLayout->addWidget(slider);
  53.     zoomLayout->addWidget(zoomoutLabel);
  54.     //坐标显示区域布局
  55.     QVBoxLayout *coordLayout = new QVBoxLayout;
  56.     coordLayout->addWidget(coordFrame);
  57.     coordLayout->addStretch();
  58.     //主布局
  59.     QHBoxLayout *mainLayout = new QHBoxLayout;
  60.     mainLayout->addLayout(zoomLayout);
  61.     mainLayout->addLayout(coordLayout);
  62.     mainLayout->addStretch();
  63.     mainLayout->setMargin(30);
  64.     mainLayout->setSpacing(10);
  65.     setLayout(mainLayout);
  66.     setWindowTitle("Map Widget");
  67.     setMinimumSize(600,400);
  68. }
  69. void MapWidget::readMap()            //读取地图信息
  70. {
  71.     QString mapName;
  72.     QFile mapFile("maps.txt");
  73.     int ok = mapFile.open(QIODevice::ReadOnly);
  74.     if(ok)
  75.     {
  76.         QTextStream ts(&mapFile);
  77.         if(!ts.atEnd())
  78.         {
  79.             ts>>mapName;
  80.             ts>>x1>>y1>>x2>>y2;
  81.         }
  82.     }
  83.     map.load(mapName);
  84. }
  85. void MapWidget::slotZoom(int value)           //地图缩放
  86. {
  87.     qreal s;
  88.     if(value>zoom)                                 //放大
  89.     {
  90.         s=pow(1.01,(value-zoom));
  91.     }
  92.     else                                     //缩小
  93.     {
  94.         s=pow(1/1.01,(zoom-value));
  95.     }
  96.     scale(s,s);
  97.     zoom = value;
  98. }
  99. void MapWidget::drawBackground(QPainter *painter, const QRectF &rect)
  100. {
  101.     painter->drawPixmap(int(sceneRect().left()),int(sceneRect().top()), map);
  102. }
  103. void MapWidget::mouseMoveEvent(QMouseEvent *event)
  104. {
  105.     //QGraphicsView 坐标
  106.     QPoint viewPoint = event->pos();
  107.     viewCoord->setText(QString::number(viewPoint.x())+","+QString::number(viewPoint.y()));
  108.     //QGraphicsScene 坐标
  109.     QPointF scenePoint = mapToScene(viewPoint);
  110.     sceneCoord->setText(QString::number(scenePoint.x())+","+QString::number(scenePoint.y()));
  111.     //地图坐标(经、纬度值)
  112.     QPointF latLon = mapToMap(scenePoint);
  113.     mapCoord->setText(QString::number(latLon.x())+","+QString::number(latLon.y()));
  114. }
  115. QPointF MapWidget::mapToMap(QPointF p)
  116. {
  117.     QPointF latLon;
  118.     qreal w =sceneRect().width();
  119.     qreal h =sceneRect().height();
  120.     qreal lon = y1-((h/2+p.y())*abs(y1-y2)/h);
  121.     qreal lat = x1+((w/2+p.x())*abs(x1-x2)/w);
  122.     latLon.setX(lat);
  123.     latLon.setY(lon);
  124.     return latLon;
  125. }
复制代码

回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2017-3-30 19:53:24 显示全部楼层

哈哈  不好意思。我也没想到复制粘贴上来就成这样了。下面那个正常点。。。麻烦指教一下
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2017-3-30 19:56:07 显示全部楼层
本帖最后由 wy1026 于 2017-3-30 19:57 编辑
  1. <pre><div class="blockcode"><blockquote>#include "mainwindow.h"
  2. #include "mapwidget.h"
  3. #include <QApplication>
  4. #include <QFont>

  5. int main(int argc, char *argv[])
  6. {
  7.     QApplication a(argc, argv);
  8.     QApplication::addLibraryPath("./plugins");
  9.     QFont font("ARPL KaitiM GB",12);
  10.     font.setBold(true);
  11.     a.setFont(font);
  12.     MapWidget mapWidget;
  13.     mapWidget.show();

  14.     return a.exec();
  15. }
复制代码


主函数
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2017-3-30 19:58:03 显示全部楼层
头文件
  1. #ifndef MAPWIDGET_H
  2. #define MAPWIDGET_H
  3. #include <QGraphicsView>
  4. #include <QLabel>
  5. #include <QMouseEvent>

  6. class MapWidget : public QGraphicsView
  7. {
  8.     Q_OBJECT
  9. public:MapWidget();

  10.     void readMap();                         //读取地图信息
  11.     QPointF mapToMap(QPointF);                          //用于实现场景坐标系与地图坐标之间的映射,以获得某点的经纬度值

  12. public slots:
  13.     void slotZoom(int);
  14. protected:
  15.     void drawBackground(QPainter *painter, const QRectF &rect);                 //完成地图显示的功能
  16.     void mouseMoveEvent(QMouseEvent *event);

  17. private:
  18.     QPixmap map;
  19.     qreal zoom;
  20.     QLabel *viewCoord;
  21.     QLabel *sceneCoord;
  22.     QLabel *mapCoord;
  23.     double x1,y1;
  24.     double x2,y2;
  25. };

  26. #endif // MAPWIDGET_H
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了