当前位置:   article > 正文

QGraphicsView 实例3地图浏览器_qgraphicsview显示地图

qgraphicsview显示地图

主要介绍Graphics View框架,实现地图的浏览、放大、缩小,以及显示各个位置的视图、场景和地图坐标

效果图:

 mapwidget.h

  1. #ifndef MAPWIDGET_H
  2. #define MAPWIDGET_H
  3. #include <QLabel>
  4. #include <QMouseEvent>
  5. #include <QGraphicsView>
  6. class MapWidget : public QGraphicsView
  7. {
  8. public:
  9. MapWidget();
  10. void readMap();
  11. QPointF mapToMap(QPointF); //实现场景坐标系与地图坐标之间的映射,以获得某点的经纬度值
  12. public slots:
  13. void slotZoom(int);
  14. QPixmap map;
  15. protected:
  16. void drawBackground(QPainter *painter,const QRectF &rect); //完成地图显示的功能
  17. void mouseMoveEvent(QMouseEvent * event);
  18. private:
  19. qreal zoom;
  20. QLabel *viewCoord;
  21. QLabel *sceneCoord;
  22. QLabel *mapCoord;
  23. double x1,x2;
  24. double y1,y2;
  25. };
  26. #endif // MAPWIDGET_H

 mapwidget.cpp

  1. #include "mapwidget.h"
  2. #include <QSlider>
  3. #include <QGridLayout>
  4. #include <QVBoxLayout>
  5. #include <QHBoxLayout>
  6. #include <QFile>
  7. #include <QGraphicsScene>
  8. #include <QTextStream>
  9. #include <math.h>
  10. #include <QLabel>
  11. /* 1、setCacheMode(CacheBackground)这个属性控制view的那一部分缓存中,QGraphicsView可以预存一些内容在QPixmap中,
  12. * 然后被绘制到viewpoint上,这样做的目的是加速整体区域重绘的速度,例如:质地、倾斜度、和最初的混合背景可能重绘很缓慢,
  13. * 尤其是在一个变形的view中,CacheBackground标志使能view的背景缓存,例如
  14. * QGraphicsView view;
  15. * view.setBackgroundBrush(QImage(":/images/backgroundtile.png"));
  16. * view.setCacheMode(QGraphicsView::CacheBackground);
  17. * 每次view转换后cache就无效了,然而,当滚动区域时候,只有部分无效默认的,没有使用cache
  18. * 2、setTickInterval(int)来设置发射信号的间隔,一般都设置为1000ms,就是1s发射一次
  19. * 3、setScaledContents(bool)这个属性保存标签是否按这个图片的比例填满所用的可用空间,默认false*/
  20. MapWidget::MapWidget()
  21. {
  22. //读取地图信息,包括地图的名称,经纬度等
  23. readMap();
  24. zoom=50;
  25. int width=map.width();
  26. int height=map.height();
  27. QGraphicsScene *scene=new QGraphicsScene(this);
  28. scene->setSceneRect(-width/2,-height/2,width,height);
  29. setScene(scene);
  30. setCacheMode(CacheBackground);
  31. //用于地图缩放的滑动条
  32. QSlider *slider=new QSlider;
  33. slider->setOrientation(Qt::Vertical);
  34. slider->setRange(1,100);
  35. slider->setTickInterval(10);
  36. slider->setValue(1);
  37. connect(slider,&QSlider::valueChanged,[=](int t_value){slotZoom(t_value);});;
  38. QLabel *zoomin=new QLabel;
  39. zoomin->setScaledContents(true);
  40. zoomin->setPixmap(QPixmap(":/image/zoomin.jpg"));
  41. zoomin->setFixedSize(30,30);
  42. QLabel *zoomout=new QLabel;
  43. zoomout->setScaledContents(true );
  44. zoomout->setPixmap(QPixmap(":/image/zoomout.jpg"));
  45. zoomout->setFixedSize(30,30);
  46. //坐标值显示区
  47. QLabel *label1=new QLabel(QStringLiteral("QGraphicsView:"));
  48. viewCoord=new QLabel;
  49. QLabel *label2=new QLabel(QStringLiteral("QGraphicsScene:"));
  50. sceneCoord=new QLabel;
  51. QLabel *label3=new QLabel(QStringLiteral("map:"));
  52. mapCoord=new QLabel;
  53. //坐标显示区布局
  54. QGridLayout *gridLayout=new QGridLayout;
  55. gridLayout->addWidget(label1,0,0);
  56. gridLayout->addWidget(viewCoord,0,1);
  57. gridLayout->addWidget(label2,1,0);
  58. gridLayout->addWidget(sceneCoord,1,1);
  59. gridLayout->addWidget(label3,2,0);
  60. gridLayout->addWidget(mapCoord,2,1);
  61. gridLayout->setSizeConstraint(QLayout::SetFixedSize);
  62. QFrame *coordFrame=new QFrame;
  63. coordFrame->setLayout(gridLayout);
  64. //坐标显示布局
  65. QVBoxLayout *coordLayout=new QVBoxLayout;
  66. coordLayout->addWidget(coordFrame);
  67. coordLayout->addStretch();
  68. //缩放控制子布局
  69. QVBoxLayout *zoomlayout=new QVBoxLayout;
  70. zoomlayout->addWidget(zoomin);
  71. zoomlayout->addWidget(slider);
  72. zoomlayout->addWidget(zoomout);
  73. //主布局
  74. QHBoxLayout *mainLayout = new QHBoxLayout;
  75. mainLayout->addLayout(zoomlayout);
  76. mainLayout->addLayout(coordLayout);
  77. mainLayout->addStretch();
  78. mainLayout->setMargin(30);
  79. mainLayout->setSpacing(10);
  80. setLayout(mainLayout);
  81. setWindowTitle(QStringLiteral("Map Widget"));
  82. setMinimumSize(600,400);
  83. }
  84. void MapWidget::readMap() //读取地图信息
  85. {
  86. QString mapName;
  87. QFile mapFile(":/image/China.txt");
  88. int ok=mapFile.open((QIODevice::ReadOnly | QIODevice::Text)); //以"只读"方式打开此文件
  89. if(ok)
  90. {
  91. QTextStream ts(&mapFile);
  92. if(!ts.atEnd())
  93. {
  94. ts >> mapName;
  95. ts>>x1>>y1>>x2>>y2;
  96. }
  97. }
  98. mapFile.close();
  99. map.load(":/image/China.jpg"); //将地图读取至私有变量map中
  100. }
  101. //根据缩放滑动条的当前值,确定当前缩放的比例
  102. void MapWidget::slotZoom(int value)
  103. {
  104. /*
  105. * 检测value(slider改变得到的值),与当前value值得大小比较
  106. * pow(x, y)表示x的y次方
  107. * slider改变的值大于zoom值时,增加缩放比例
  108. * slider改变的值小于zoom值时,减小缩放比例
  109. * scale(s, s)将当前的视图换为(s, s)
  110. */
  111. qreal s;
  112. if(value>zoom) //放大
  113. {
  114. s=pow(1.01,(value-zoom));
  115. }
  116. else
  117. {
  118. s=pow(1/1.01,(zoom-value));
  119. }
  120. scale(s,s); //实现地图的缩放
  121. zoom=value;
  122. }
  123. //以地图图片重绘场景的背景来实现地图显示
  124. void MapWidget::drawBackground(QPainter *painter, const QRectF &rect)
  125. {
  126. painter->drawPixmap(int(sceneRect().left()),int(sceneRect().top()),map);
  127. }
  128. //完成某点在坐标上的映射和显示
  129. void MapWidget::mouseMoveEvent(QMouseEvent *event)
  130. {
  131. //QGraphicsView坐标
  132. QPoint viewpoint=event->pos();
  133. viewCoord->setText(QString::number(viewpoint.x())+","+QString::number(viewpoint.y()));
  134. //QGraphicsScene坐标
  135. QPointF scenePoint=mapToScene(viewpoint);
  136. sceneCoord->setText(QString::number(scenePoint.x())+","+QString::number(scenePoint.y()));
  137. //地图坐标(经纬度)
  138. QPointF latLon= mapToMap(scenePoint);
  139. mapCoord->setText(QString::number(latLon.x())+","+QString::number(latLon.y()));
  140. }
  141. QPointF MapWidget::mapToMap(QPointF p)
  142. {
  143. QPointF latLon;
  144. qreal w=sceneRect().width();
  145. qreal h=sceneRect().height();
  146. qreal lon=y1-((h/2+p.y())*abs(y1-y2)/h);
  147. qreal lat=y1-((w/2+p.x())*abs(x1-x2)/w);
  148. latLon.setX(lat);
  149. latLon.setY(lon);
  150. return latLon;
  151. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/91718
推荐阅读
相关标签
  

闽ICP备14008679号