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(); }
效果展示
没有找的适合的地图,所以没有插入地图图片,无法获得经纬度,只获得视图和场景的坐标
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- Qt5图形视图框架的“俄罗斯方块”(使用了QGraphicsView)
- 图形视图框架(The QGraphics View Framework)(转)
- 图形视图框架(The QGraphics View Framework)
- Django基础核心技术介绍(3): 视图View的编写及如何使用通用视图(Generic View)
- 图形视图框架(The QGraphics View Framework)
- 图形视图框架(The QGraphics View Framework)
- 图形视图框架(The QGraphics View Framework)
- QT图形视图框架(The QGraphics View Framework)(转)(六)
- Qt图形视图框架(The QGraphics View Framework)
- 图形视图框架(The QGraphics View Framework)
- 图形视图框架(The QGraphics View Framework)(转)
- 图形视图框架(The QGraphics View Framework)
- 图形视图框架(The QGraphics View Framework 翻译)
- 图形视图框架(The QGraphics View Framework)
- ASP.NET在禁用视图状态的情况下仍然使用ViewState对象【转】
- 在禁用视图状态的情况下仍然使用ViewState对象
- MVC PartialView视图使用心得
- QT图形视图体系 (The Graphics View Framework)
- 使用wxWidgets为[图片转ascii的Pyton程序]编写图形界面
- iPhone开发【十八】自定义视图之ActionSheet中使用PickerView