









现在流行无人机和机器人,未来这块的增量是巨大的,地图组件也顺势而为,之前用web版本的地图组件绘制100个无人机,还行,就是耗时比较多,而且占用内存较大,性能较低,如果是1000个,那基本上歇菜,根本都无法完成,毕竟在web的地图组件中,marker对象是一个很多参数的对象,每一个都需要分配不少的内存,不适合大量的对象,在花了巨大精力用纯QPainter实现这个widget版本的地图组件,本着百倍性能提升的目标去的,亲自验证了下,1000个无人机只需要7ms就完成,不要太好,可以说是瞬间完成,各位web程序员还把web吹上天,在很多大量绘制场景中,还是必须cs架构的软件更擅长。

#include "frmmarker.h"
#include "ui_frmmarker.h"
#include "qthelper.h"
#include "maphelper.h"
#include "maputil.h"
#include "overlaybase.h"
#include "overlayhelper.h"
frmMarker::frmMarker(QWidget *parent) : QWidget(parent), ui(new Ui::frmMarker)
{
ui->setupUi(this);
this->initForm();
this->initConfig();
this->loadMap();
}
frmMarker::~frmMarker()
{
delete ui;
}
void frmMarker::initForm()
{
offset = 5;
flag = "marker";
marker = NULL;
ui->mapWidget->setFlag("frmMarker");
connect(ui->mapWidget, SIGNAL(receivePoint(qreal, qreal)), this, SLOT(receivePoint(qreal, qreal)));
}
void frmMarker::initConfig()
{
MapHelper::loadTileSource(ui->cboxTileSource, AppConfig::MarkerSource);
connect(ui->cboxTileSource, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));
connect(ui->cboxTileSource, SIGNAL(currentIndexChanged(int)), this, SLOT(loadMap()));
MapHelper::loadTileType(ui->cboxTileType, AppConfig::MarkerType);
connect(ui->cboxTileType, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));
connect(ui->cboxTileType, SIGNAL(currentIndexChanged(int)), this, SLOT(loadMap()));
ui->cboxOffline->setCurrentIndex(AppConfig::MarkerOffline);
connect(ui->cboxOffline, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));
connect(ui->cboxOffline, SIGNAL(currentIndexChanged(int)), this, SLOT(loadMap()));
ui->cboxCache->setCurrentIndex(AppConfig::MarkerCache);
connect(ui->cboxCache, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));
connect(ui->cboxCache, SIGNAL(currentIndexChanged(int)), this, SLOT(loadMap()));
MapHelper::loadAlignType(ui->cboxMarkerAlign, 5);
MapHelper::loadAlignType(ui->cboxTextAlign, 4);
ui->cboxFontSize->setCurrentIndex(2);
ui->cboxNumber->setCurrentIndex(2);
ui->cboxTextColor->setColorName("red");
ui->cboxTextBgColor->setColorName("black");
ui->cboxTextBorderColor->setColorName("blue");
}
void frmMarker::saveConfig()
{
AppConfig::MarkerSource = ui->cboxTileSource->itemData(ui->cboxTileSource->currentIndex()).toInt();
AppConfig::MarkerType = ui->cboxTileType->itemData(ui->cboxTileType->currentIndex()).toInt();
AppConfig::MarkerOffline = ui->cboxOffline->currentIndex();
AppConfig::MarkerCache = ui->cboxCache->currentIndex();
AppConfig::writeConfig();
}
void frmMarker::loadMap()
{
on_btnClearMarker_clicked();
int tileSource = ui->cboxTileSource->itemData(ui->cboxTileSource->currentIndex()).toInt();
ui->mapWidget->setTileSource(TileSource(tileSource));
int tileType = ui->cboxTileType->itemData(ui->cboxTileType->currentIndex()).toInt();
ui->mapWidget->setTileType(TileType(tileType));
QString offlinePath = TileHelper::getOfflinePath(TileSource(tileSource));
ui->mapWidget->setOffline(ui->cboxOffline->currentIndex() == 1);
ui->mapWidget->setOfflinePath(offlinePath);
QString cachePath = (ui->cboxCache->currentIndex() == 1 ? QtHelper::appPath() + "/mapcache" : "");
ui->mapWidget->setCachePath(cachePath);
ui->mapWidget->load();
}
void frmMarker::receivePoint(qreal lng, qreal lat)
{
ui->txtLng->setText(QString::number(lng, 'f', 6));
ui->txtLat->setText(QString::number(lat, 'f', 6));
ui->mapWidget->updateMarker(flag, lng, lat);
ui->mapWidget->updateShape("shape", lng, lat);
}
QString frmMarker::getImage()
{
int index = ui->cboxMarkerType->currentIndex();
QString image = ":/image/marker.png";
if (index == 1) {
image = ":/image/fly.png";
} else if (index == 2) {
image = ":/image/gif_person.gif";
}
return image;
}
void frmMarker::on_btnCreateMarker_clicked()
{
if (!marker) {
qreal lng = ui->txtLng->text().toDouble();
qreal lat = ui->txtLat->text().toDouble();
QString image = this->getImage();
//创建标注点对象
int rotate = ui->sboxRotate->value();
int align = ui->cboxMarkerAlign->itemData(ui->cboxMarkerAlign->currentIndex()).toInt();
marker = ui->mapWidget->addMarker(flag, lng, lat, image, QPixmap(), rotate, align);
//更新提示信息参数
QString text = ui->txtText->text();
QColor textColor = ui->cboxTextColor->getColorName();
int textAlign = ui->cboxTextAlign->itemData(ui->cboxTextAlign->currentIndex()).toInt();
int fontSize = ui->cboxFontSize->currentText().toInt();
QColor bgColor = ui->cboxTextBgColor->getColorName();
int bgAlpha = ui->sboxTextBgAlpha->value();
QColor borderColor = ui->cboxTextBorderColor->getColorName();
OverlayHelper::updateText(marker, text);
OverlayHelper::updateTextPara(marker, textColor, textAlign, offset, QString(), fontSize, bgColor, bgAlpha, borderColor);
//添加原始位置参照
ui->mapWidget->addShape("shape", lng, lat, textColor, 8);
}
}
void frmMarker::on_btnCreateMarkers_clicked()
{
//先清空所有
on_btnClearMarker_clicked();
ui->btnCreateMarkers->setEnabled(false);
//以地图左下角为起点/随机生成多个点坐标
QString image = ":/image/fly.png";
int number = ui->cboxNumber->currentText().toInt();
QList<QPointF> points = MapHelper::getRandPoints(ui->mapWidget->getRect(), number);
foreach (QPointF point, points) {
int rotate = rand() % 360;
ui->mapWidget->addMarker("markers", point.x(), point.y(), image, QPixmap(), rotate, 2);
}
ui->btnCreateMarkers->setEnabled(true);
}
void frmMarker::on_btnClearMarker_clicked()
{
marker = NULL;
ui->mapWidget->clearOverlay();
//ui->mapWidget->deleteGroup("shape");
//ui->mapWidget->deleteGroup("marker");
}
void frmMarker::on_cboxMarkerType_currentIndexChanged(int index)
{
QString image = this->getImage();
ui->mapWidget->updateMarker(flag, NULL, NULL, image);
}
void frmMarker::on_cboxMarkerAlign_currentIndexChanged(int index)
{
int align = ui->cboxMarkerAlign->itemData(index).toInt();
ui->mapWidget->updateMarker(flag, NULL, NULL, QString(), QPixmap(), -1, align);
}
void frmMarker::on_sboxRotate_valueChanged(int arg1)
{
ui->mapWidget->updateMarker(flag, NULL, NULL, QString(), QPixmap(), arg1, -1);
}
void frmMarker::on_txtText_textChanged(const QString &arg1)
{
OverlayHelper::updateText(marker, arg1);
}
void frmMarker::on_cboxTextColor_currentIndexChanged(int index)
{
QColor textColor = ui->cboxTextColor->getColorName();
OverlayHelper::updateTextPara(marker, textColor);
ui->mapWidget->updateShape("shape", NULL, NULL, textColor);
}
void frmMarker::on_cboxFontSize_currentIndexChanged(int index)
{
int fontSize = ui->cboxFontSize->currentText().toInt();
OverlayHelper::updateTextPara(marker, QColor(), -1, offset, QString(), fontSize);
}
void frmMarker::on_cboxTextAlign_currentIndexChanged(int index)
{
int textAlign = ui->cboxTextAlign->itemData(index).toInt();
OverlayHelper::updateTextPara(marker, QColor(), textAlign, offset, QString(), 0);
}
void frmMarker::on_cboxTextBgColor_currentIndexChanged(int index)
{
QColor bgColor = ui->cboxTextBgColor->getColorName();
OverlayHelper::updateTextPara(marker, QColor(), -1, offset, QString(), 0, bgColor, 0, QColor(), 0);
}
void frmMarker::on_sboxTextBgAlpha_valueChanged(int arg1)
{
int bgAlpha = ui->sboxTextBgAlpha->value();
OverlayHelper::updateTextPara(marker, QColor(), -1, offset, QString(), 0, QColor(), bgAlpha, QColor(), 0);
}
void frmMarker::on_cboxTextBorderColor_currentIndexChanged(int index)
{
QColor borderColor = ui->cboxTextBorderColor->getColorName();
OverlayHelper::updateTextPara(marker, QColor(), -1, offset, QString(), 0, QColor(), 0, borderColor, 0);
}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。