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();
}
效果展示
没有找的适合的地图,所以没有插入地图图片,无法获得经纬度,只获得视图和场景的坐标