









为什么还要支持Qt4,很多人不理解,因为这个地图控件的诞生初期的需求,有一个需求就是为了满足国产化低配电脑上运行的要求,旧时代遗留的产物,包括有些古董项目,当时用的就是Qt4,而且无法升级到Qt5及以上,必须保证原有的代码能够正常在Qt4编译运行,而又需要增加新的地图相关的功能,甚至一些旧的环境尤其是军工企业,上面只能跑很老的linux系统,当时也只有Qt4支持上面运行,系统是固定的肯定不能换了,那就只能让代码适配Qt版本,这是没有办法的办法,所以本地图控件的设计初期,也就没有去采用c++11的标准,还是按照c99的标准写的。
说到这里又有些人要抬杠了,用这么古老的语法,会不会性能很低下啊,以前我也是这么认为的,后面实际大量使用下来,发现是错误的,新标准只是增加了新特性以及一些语法糖,是为了方便写,或者语法检查,并不能带来多少性能提升,或者说根本就没有性能提升,比如Qt5引入的信号槽的新写法,只是为了编译期间做参数检查,更严格更标准,性能提升完全没有,还有什么lm表达式啥的,纯粹是语法糖。用c99标准写的代码,在新的编译器编译,依旧溜得起飞。


#include "mapwidget.h"
#include "maphelper.h"
#include "layermap.h"
#include "overlayhelper.h"
#include "overlaycluster.h"
#include "drawhelper.h"
MapWidget::MapWidget(QWidget *parent) : MapControl(QSize(100, 30), parent)
{
tileSource = TileSource_None;
tileType = TileType_Street;
offline = false;
offlinePath = ".";
//转发鼠标事件信号到绘图处理/信号来自基类/槽为本类实现
connect(this, SIGNAL(mouseEvent(int, QMouseEvent *, PointWorldCoord, PointWorldCoord)), this, SLOT(mouseEvent(int, QMouseEvent *, PointWorldCoord, PointWorldCoord)));
//添加瓦片图层
TileHelper::loadTile(this, tileSource, tileType, offline, offlinePath);
//添加图形图层
overlayLayer = new LayerOverlay("overlayLayer");
overlayLayer->setTileSize(this->tileSize());
overlayLayer->setEpsgType(this->epsgType());
overlayLayer->setMouseEventsEnabled(true);
this->addLayer(overlayLayer);
}
void MapWidget::mouseEvent(int mouse_type, QMouseEvent *mouse_event, PointWorldCoord press_coord, PointWorldCoord current_coord)
{
DrawHelper::doMouseEvent(this, mouse_type, mouse_event, press_coord, current_coord);
}
void MapWidget::load()
{
emit mapLoading();
QMutexLocker locker(&mutex);
bool gcj02 = (tileSource == TileSource_GaoDe || tileSource == TileSource_TengXun || tileSource == TileSource_Google || (tileSource == TileSource_Bing && tileType == TileType_Street));
this->setGcj02Base(gcj02, false);
this->setGcj02Tile(gcj02, false);
TileHelper::changeTile(this, tileSource, tileType, offline, offlinePath);
}
QString MapWidget::getFlag() const
{
return this->objectName().split('_').last();
}
void MapWidget::setFlag(const QString &flag)
{
MapControl::setFlag(flag);
this->setObjectName(QString("MapWidget_%1").arg(flag));
}
QPointF MapWidget::getCenter() const
{
return this->mapFocusPoint().rawPoint();
}
void MapWidget::setCenter(const QPointF &point, bool redraw)
{
this->setMapFocusPoint(point, redraw);
}
void MapWidget::setCenter(const QString &point, bool redraw)
{
this->setCenter(MapHelper::textToPoint(point), redraw);
}
QRectF MapWidget::getRect() const
{
return this->viewportRect().rawRect();
}
void MapWidget::setRect(const QRectF &rect)
{
this->setAutoView(rect);
}
LayerOverlay *MapWidget::getOverlayLayer()
{
return this->overlayLayer;
}
void MapWidget::setLayerVisible(bool visible)
{
if (overlayLayer) {
overlayLayer->setVisible(visible);
}
}
QList<OverlayBase *> MapWidget::getOverlays()
{
return overlayLayer->getOverlays();
}
OverlayBase *MapWidget::getOverlay(const QString &flag)
{
return overlayLayer->getOverlay(flag);
}
QList<OverlayBase *> MapWidget::getOverlays(OverlayType type)
{
return overlayLayer->getOverlays(type);
}
void MapWidget::addOverlay(OverlayBase *overlay, bool redraw)
{
if (overlayLayer && overlay) {
overlayLayer->addOverlay(overlay, redraw);
if (receivers(SIGNAL(overlayChanged(int, OverlayBase *))) > 0) {
emit overlayChanged(ChangedType_Add, overlay);
}
}
}
void MapWidget::deleteOverlay(OverlayBase *overlay, bool redraw)
{
if (overlayLayer && overlay) {
overlayLayer->removeOverlay(overlay, redraw);
if (receivers(SIGNAL(overlayChanged(int, OverlayBase *))) > 0) {
emit overlayChanged(ChangedType_Delete, overlay);
}
}
}
void MapWidget::clearOverlay(bool redraw)
{
if (overlayLayer) {
overlayLayer->clearOverlays(redraw);
if (receivers(SIGNAL(overlayChanged(int, OverlayBase *))) > 0) {
emit overlayChanged(ChangedType_Clear, NULL);
}
}
}
void MapWidget::setTileSource(TileSource tileSource)
{
this->tileSource = tileSource;
}
void MapWidget::setTileType(TileType tileType)
{
this->tileType = tileType;
}
void MapWidget::setOffline(bool offline)
{
this->offline = offline;
}
void MapWidget::setOfflinePath(const QString &offlinePath)
{
this->offlinePath = offlinePath;
}
void MapWidget::setCachePath(const QString &cachePath)
{
this->enableCache(cachePath, offline);
}
void MapWidget::savePixmap(const QString &fileName, bool full, const QVector<QPointF> &points)
{
MapHelper::savePixmap(this, fileName, full, points);
}
void MapWidget::setAutoView(const QRectF &rect)
{
MapHelper::setAutoView(this, rect);
}
void MapWidget::setAutoView(const QString &points)
{
MapHelper::setAutoView(this, MapHelper::pointsToRect(points));
}
void MapWidget::setAutoView(const QVector<QPointF> &points)
{
MapHelper::setAutoView(this, MapHelper::pointsToRect(points));
}
OverlayBase *MapWidget::addShape(const QString &flag, const QPointF &point, const QColor &color, int width, int style, bool redraw)
{
return OverlayHelper::addShape(this, flag, point, color, width, style, redraw);
}
void MapWidget::updateShape(const QString &flag, const QPointF &point, const QColor &color, int width, int style, bool redraw)
{
OverlayHelper::updateShape(this, flag, point, color, width, style, redraw);
}
QPointF MapWidget::getShapeCoord(const QString &flag)
{
return OverlayHelper::getShapeCoord(this, flag);
}
OverlayBase *MapWidget::addLabel(const QString &flag, const QPointF &point, const QColor &color, const QString &text, int align, int size, int rotate, bool redraw)
{
return OverlayHelper::addLabel(this, flag, point, color, text, align, size, rotate, redraw);
}
void MapWidget::updateLabel(const QString &flag, const QPointF &point, const QColor &color, const QString &text, int align, int size, int rotate, bool redraw)
{
OverlayHelper::updateLabel(this, flag, point, color, text, align, size, rotate, redraw);
}
QPointF MapWidget::getLabelPara(const QString &flag, QString *text, int *rotate)
{
return OverlayHelper::getLabelPara(this, flag, text, rotate);
}
OverlayBase *MapWidget::addMarker(const QString &flag, const QPointF &point, const QString &image, const QPixmap &pixmap, int rotate, int align, bool redraw)
{
return OverlayHelper::addMarker(this, flag, point, image, pixmap, rotate, align, redraw);
}
void MapWidget::updateMarker(const QString &flag, const QPointF &point, const QString &image, const QPixmap &pixmap, int rotate, int align, bool redraw)
{
OverlayHelper::updateMarker(this, flag, point, image, pixmap, rotate, align, redraw);
}
void MapWidget::updateMarkerSize(const QString &flag, const QSize &size, bool keepAspectRatio, bool redraw)
{
OverlayHelper::updateMarkerSize(this, flag, size, keepAspectRatio, redraw);
}
QPointF MapWidget::getMarkerPara(const QString &flag, QPixmap *image, int *rotate, int *align)
{
return OverlayHelper::getMarkerPara(this, flag, image, rotate, align);
}
OverlayBase *MapWidget::addMarkerCircle(const QString &flag, const QPointF &point, const QString &text, const QSize &size, const QColor &color, int width, int style, const QColor &bgColor, int bgStyle, const QColor &textColor, bool redraw)
{
return OverlayHelper::addMarkerCircle(this, flag, point, text, size, color, width, style, bgColor, bgStyle, textColor, redraw);
}
void MapWidget::updateMarkerCircle(const QString &flag, const QPointF &point, const QString &text, const QSize &size, const QColor &color, int width, int style, const QColor &bgColor, int bgStyle, const QColor &textColor, bool redraw)
{
OverlayHelper::updateMarkerCircle(this, flag, point, text, size, color, width, style, bgColor, bgStyle, textColor, redraw);
}
QPointF MapWidget::getMarkerCirclePara(const QString &flag, QString *text)
{
return OverlayHelper::getMarkerCirclePara(this, flag, text);
}
OverlayBase *MapWidget::addPolyline(const QString &flag, const QStringList &points, const QColor &color, int width, int style, bool redraw)
{
return OverlayHelper::addPolyline(this, flag, MapHelper::pointsToCoords(points), color, width, style, redraw);
}
OverlayBase *MapWidget::addPolyline(const QString &flag, const QVector<QPointF> &points, const QColor &color, int width, int style, bool redraw)
{
return OverlayHelper::addPolyline(this, flag, MapHelper::pointsToCoords(points), color, width, style, redraw);
}
void MapWidget::updatePolyline(const QString &flag, const QColor &color, int width, int style, bool redraw)
{
OverlayHelper::updatePolyline(this, flag, color, width, style, redraw);
}
QVector<QPointF> MapWidget::getPolylinePoints(const QString &flag)
{
return OverlayHelper::getPolylinePoints(this, flag);
}
void MapWidget::addPolylinePoint(const QString &flag, const QPointF &point, bool redraw)
{
OverlayHelper::addPolylinePoint(this, flag, point, redraw);
}
void MapWidget::setPolylinePoints(const QString &flag, const QVector<QPointF> &points, bool redraw)
{
OverlayHelper::setPolylinePoints(this, flag, MapHelper::pointsToCoords(points), redraw);
}
OverlayBase *MapWidget::addPolygon(const QString &flag, const QStringList &points, const QColor &color, int width, int style, const QColor &bgColor, int bgStyle, bool redraw)
{
return OverlayHelper::addPolygon(this, flag, MapHelper::pointsToCoords(points), color, width, style, bgColor, bgStyle, redraw);
}
void MapWidget::addPolygon(const QString &flag, const QVector<QPointF> &points, const QColor &color, int width, int style, const QColor &bgColor, int bgStyle, bool redraw)
{
OverlayHelper::addPolygon(this, flag, MapHelper::pointsToCoords(points), color, width, style, bgColor, bgStyle, redraw);
}
void MapWidget::updatePolygon(const QString &flag, const QColor &color, int width, int style, const QColor &bgColor, int bgStyle, bool redraw)
{
OverlayHelper::updatePolygon(this, flag, color, width, style, bgColor, bgStyle, redraw);
}
QVector<QPointF> MapWidget::getPolygonPoints(const QString &flag)
{
return OverlayHelper::getPolygonPoints(this, flag);
}
void MapWidget::addPolygonPoint(const QString &flag, const QPointF &point, bool redraw)
{
OverlayHelper::addPolygonPoint(this, flag, point, redraw);
}
void MapWidget::setPolygonPoints(const QString &flag, const QVector<QPointF> &points, bool redraw)
{
OverlayHelper::setPolygonPoints(this, flag, MapHelper::pointsToCoords(points), redraw);
}
void MapWidget::addBoundary(const QString &flag, const QString &points, const QColor &color, int width, int style, const QColor &bgColor, int bgStyle, bool redraw)
{
OverlayHelper::addBoundary(this, flag, points, color, width, style, bgColor, bgStyle, redraw);
}
void MapWidget::addBoundary(const QString &flag, const QList<QPolygonF> &plys, const QColor &color, int width, int style, const QColor &bgColor, int bgStyle, bool redraw)
{
OverlayHelper::addBoundary(this, flag, plys, color, width, style, bgColor, bgStyle, redraw);
}
OverlayBase *MapWidget::addRectangle(const QString &flag, const QRectF &rect, const QColor &color, int width, int style, const QColor &bgColor, int bgStyle, bool redraw)
{
return this->addRectangle(flag, rect.topLeft(), rect.bottomRight(), color, width, style, bgColor, bgStyle, redraw);
}
OverlayBase *MapWidget::addRectangle(const QString &flag, const QPointF &topLeft, const QPointF &bottomRight, const QColor &color, int width, int style, const QColor &bgColor, int bgStyle, bool redraw)
{
return OverlayHelper::addRectangle(this, flag, topLeft, bottomRight, color, width, style, bgColor, bgStyle, redraw);
}
void MapWidget::updateRectangle(const QString &flag, const QPointF &topLeft, const QPointF &bottomRight, const QColor &color, int width, int style, const QColor &bgColor, int bgStyle, bool redraw)
{
OverlayHelper::updateRectangle(this, flag, topLeft, bottomRight, color, width, style, bgColor, bgStyle, redraw);
}
QRectF MapWidget::getRectangleRect(const QString &flag)
{
return OverlayHelper::getRectangleRect(this, flag);
}
OverlayBase *MapWidget::addCircle(const QString &flag, const QPointF &point, qreal radius, const QColor &color, int width, int style, const QColor &bgColor, int bgStyle, bool redraw)
{
return OverlayHelper::addCircle(this, flag, point, radius, color, width, style, bgColor, bgStyle, redraw);
}
void MapWidget::updateCircle(const QString &flag, const QPointF &point, qreal radius, const QColor &color, int width, int style, const QColor &bgColor, int bgStyle, bool redraw)
{
OverlayHelper::updateCircle(this, flag, point, radius, color, width, style, bgColor, bgStyle, redraw);
}
QRectF MapWidget::getCirclePara(const QString &flag, qreal *lng, qreal *lat, qreal *radius)
{
return OverlayHelper::getCirclePara(this, flag, lng, lat, radius);
}
OverlayBase *MapWidget::addRadar(const QString &flag, const QPointF &point, qreal radius, const QColor &color, int width, int alpha, bool redraw)
{
return OverlayHelper::addRadar(this, flag, point, radius, color, width, alpha, redraw);
}
void MapWidget::updateRadar(const QString &flag, const QPointF &point, qreal radius, qreal sweepAngle, qreal headingAngle, const QColor &color, int width, int alpha, bool redraw)
{
OverlayHelper::updateRadar(this, flag, point, radius, sweepAngle, headingAngle, color, width, alpha, redraw);
}
QRectF MapWidget::getRadarPara(const QString &flag, qreal *lng, qreal *lat, qreal *radius, qreal *sweepAngle, qreal *headingAngle)
{
return OverlayHelper::getRadarPara(this, flag, lng, lat, radius, sweepAngle, headingAngle);
}
OverlayBase *MapWidget::addCluster(const QString &flag, const QVector<QPointF> &points, bool redraw)
{
return OverlayHelper::addCluster(this, flag, MapHelper::pointsToClusterPoints(points), redraw);
}
OverlayBase *MapWidget::addCluster(const QString &flag, const QVector<ClusterPoint> &points, bool redraw)
{
return OverlayHelper::addCluster(this, flag, points, redraw);
}
void MapWidget::updateCluster(const QString &flag, int distance, int radius, const QColor &color, int textSize, const QColor &textColor, int pointRadius, const QColor &pointColor, bool redraw)
{
OverlayHelper::updateCluster(this, flag, distance, radius, color, textSize, textColor, pointRadius, pointColor, redraw);
}
QVector<QPointF> MapWidget::getClusterPoints(const QString &flag)
{
return OverlayHelper::getClusterPoints(this, flag);
}
void MapWidget::addClusterPoint(const QString &flag, const ClusterPoint &point, bool redraw)
{
OverlayHelper::addClusterPoint(this, flag, point, redraw);
}
void MapWidget::setClusterPoints(const QString &flag, const QVector<QPointF> &points, bool redraw)
{
OverlayHelper::setClusterPoints(this, flag, MapHelper::pointsToClusterPoints(points), redraw);
}
void MapWidget::setClusterPoints(const QString &flag, const QVector<ClusterPoint> &points, bool redraw)
{
OverlayHelper::setClusterPoints(this, flag, points, redraw);
}
OverlayBase *MapWidget::addHeatmap(const QString &flag, const QVector<QPointF> &points, bool redraw)
{
return OverlayHelper::addHeatmap(this, flag, MapHelper::pointsToHeatPoints(points), redraw);
}
OverlayBase *MapWidget::addHeatmap(const QString &flag, const QVector<HeatPoint> &points, bool redraw)
{
return OverlayHelper::addHeatmap(this, flag, points, redraw);
}
void MapWidget::updateHeatmap(const QString &flag, int radius, int intensity, int opacity, bool redraw)
{
OverlayHelper::updateHeatmap(this, flag, radius, intensity, opacity, redraw);
}
QVector<QPointF> MapWidget::getHeatmapPoints(const QString &flag)
{
return OverlayHelper::getHeatmapPoints(this, flag);
}
void MapWidget::addHeatmapPoint(const QString &flag, const HeatPoint &point, bool redraw)
{
OverlayHelper::addHeatmapPoint(this, flag, point, redraw);
}
void MapWidget::setHeatmapPoints(const QString &flag, const QVector<QPointF> &points, bool redraw)
{
OverlayHelper::setHeatmapPoints(this, flag, MapHelper::pointsToHeatPoints(points), redraw);
}
void MapWidget::setHeatmapPoints(const QString &flag, const QVector<HeatPoint> &points, bool redraw)
{
OverlayHelper::setHeatmapPoints(this, flag, points, redraw);
}
void MapWidget::addWidget(const QString &flag, const QPointF &point, QWidget *form, bool redraw)
{
OverlayHelper::addWidget(this, flag, point, form, redraw);
}
void MapWidget::updateWidget(const QString &flag, const QPointF &point, bool redraw)
{
OverlayHelper::updateWidget(this, flag, point, redraw);
}
QWidget *MapWidget::getWidget(const QString &flag)
{
return OverlayHelper::getWidget(this, flag);
}
void MapWidget::deleteOverlay(const QString &flag, bool redraw)
{
OverlayHelper::deleteOverlay(this, flag, redraw);
}
void MapWidget::deleteGroup(const QString &group, bool redraw)
{
OverlayHelper::deleteGroup(this, group, redraw);
}
void MapWidget::setOverlayZIndex(const QString &flag, int zindex)
{
OverlayHelper::setOverlayZIndex(this, flag, zindex);
}
void MapWidget::setOverlayZIndex(OverlayBase *overlay, int zindex, bool redraw)
{
overlayLayer->setOverlayZIndex(overlay, zindex, redraw);
}
void MapWidget::setOverlayVisible(const QString &flag, bool visible)
{
OverlayHelper::setOverlayVisible(this, flag, visible);
}
void MapWidget::setOverlayVisible(OverlayBase *overlay, bool visible, bool redraw)
{
overlay->setVisible(visible, redraw);
}
void MapWidget::setOverlayEdit(const QString &flag, bool edit)
{
OverlayHelper::setOverlayEdit(this, flag, edit);
}
void MapWidget::setOverlayEdit(OverlayBase *overlay, bool edit, bool redraw)
{
overlay->setEdit(edit, redraw);
}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。