From 9cea00db71fb37b24a9a1a88690a11e8cc184a8f Mon Sep 17 00:00:00 2001 From: zhangxusong <328180668@qq.com> Date: Fri, 26 Aug 2022 08:25:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AE=9A=E7=82=B9=E5=AF=BC?= =?UTF-8?q?=E8=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/mainwindow.cpp | 21 ++- App/mainwindow.h | 3 +- Cockpit/Cockpit.cpp | 3 +- opmap/mapwidget/circlepointitem.cpp | 166 +++++++++++++++++++ opmap/mapwidget/circlepointitem.h | 84 ++++++++++ opmap/mapwidget/mapgraphicitem.cpp | 5 + opmap/mapwidget/mapwidget.pro | 16 +- opmap/mapwidget/opmapwidget.cpp | 100 ++++++++++-- opmap/mapwidget/opmapwidget.h | 22 ++- opmap/mapwidget/waypointitem.cpp | 64 +++++++- opmap/mapwidget/waypointitem.h | 23 ++- opmap/mapwidget/waypointparamdialog.cpp | 54 +++++++ opmap/mapwidget/waypointparamdialog.h | 39 +++++ opmap/mapwidget/waypointparamdialog.ui | 204 ++++++++++++++++++++++++ opmap/mapwidget/waypointparamitem.cpp | 13 ++ opmap/mapwidget/waypointparamitem.h | 19 +++ opmap/mapwidget/waypointparammenu.cpp | 14 ++ opmap/mapwidget/waypointparammenu.h | 22 +++ opmap/mapwidget/waypointparammenu.ui | 21 +++ 19 files changed, 872 insertions(+), 21 deletions(-) create mode 100644 opmap/mapwidget/circlepointitem.cpp create mode 100644 opmap/mapwidget/circlepointitem.h create mode 100644 opmap/mapwidget/waypointparamdialog.cpp create mode 100644 opmap/mapwidget/waypointparamdialog.h create mode 100644 opmap/mapwidget/waypointparamdialog.ui create mode 100644 opmap/mapwidget/waypointparamitem.cpp create mode 100644 opmap/mapwidget/waypointparamitem.h create mode 100644 opmap/mapwidget/waypointparammenu.cpp create mode 100644 opmap/mapwidget/waypointparammenu.h create mode 100644 opmap/mapwidget/waypointparammenu.ui diff --git a/App/mainwindow.cpp b/App/mainwindow.cpp index 9404ee9..d9d7c93 100644 --- a/App/mainwindow.cpp +++ b/App/mainwindow.cpp @@ -1,4 +1,4 @@ -#include "mainwindow.h" +#include "mainwindow.h" #include "QPushButton" #include "QAction" @@ -191,6 +191,16 @@ MainWindow::MainWindow(QWidget *parent) map->SetZoom(4); map->SetCurrentPosition(internals::PointLatLng(33,106)); +// connect(map,SIGNAL(cmd_long( float param1,float param2,float param3,float param4,float param5,float param6,float param7,uint16_t command,uint8_t confirmation) ), +// commandUI, SLOT(cmd_long( float param1,float param2,float param3,float param4,float param5,float param6,float param7,uint16_t command,uint8_t confirmation) ) ); + +// connect(map, SIGNAL(cmd_long( float param1,float param2,float param3,float param4,float param5,float param6,float param7,uint16_t command,uint8_t confirmation) ), +// this, SLOT(cmd_longSlot(float param1,float param2,float param3,float param4,float param5,float param6,float param7,uint16_t command,uint8_t confirmation)) ); + + connect(map, SIGNAL(cmd_long( float ,float ,float ,float ,float ,float ,float ,uint16_t ,uint8_t )), + commandUI, SIGNAL(cmd_long( float ,float ,float ,float ,float ,float ,float ,uint16_t ,uint8_t )) ); + connect(map, SIGNAL(cmd_long( float ,float ,float ,float ,float ,float ,float ,uint16_t ,uint8_t )), + this, SLOT(cmd_longSlot( float ,float ,float ,float ,float ,float ,float ,uint16_t ,uint8_t )) ); qDebug() << "map start"; @@ -982,6 +992,8 @@ void MainWindow::onTabIndexChanged(const int &index)//界面选择管理 if(index == 5) { + map->setCircleCreate(true); + map->setCircleEdit(true); if(statusui->isHidden()) { copk->show(); @@ -1003,6 +1015,8 @@ void MainWindow::onTabIndexChanged(const int &index)//界面选择管理 } else { + map->setCircleEdit(false); + map->setCircleCreate(false); statusui->hide(); } @@ -1010,6 +1024,11 @@ void MainWindow::onTabIndexChanged(const int &index)//界面选择管理 resizeEvent(nullptr); } +void MainWindow::cmd_longSlot(float param1, float param2, float param3, float param4, float param5, float param6, float param7, uint16_t command, uint8_t confirmation) +{ + qDebug() << "MainWindow: 半径" << param3 << " 纬度:" << param5 << " 经度:" << param6; +} + void MainWindow::showMessage(const QString &message, int TimeOut) diff --git a/App/mainwindow.h b/App/mainwindow.h index 3e0f78d..ef67eac 100644 --- a/App/mainwindow.h +++ b/App/mainwindow.h @@ -1,4 +1,4 @@ -#ifndef MAINWINDOW_H +#ifndef MAINWINDOW_H #define MAINWINDOW_H #include @@ -94,6 +94,7 @@ protected slots: private slots: void onTabIndexChanged(const int &index); + void cmd_longSlot(float param1,float param2,float param3,float param4,float param5,float param6,float param7,uint16_t command,uint8_t confirmation); void updateUI(); diff --git a/Cockpit/Cockpit.cpp b/Cockpit/Cockpit.cpp index 0f6853c..3813afb 100644 --- a/Cockpit/Cockpit.cpp +++ b/Cockpit/Cockpit.cpp @@ -1,10 +1,11 @@ -#include "Cockpit.h" +#include "Cockpit.h" #include #include #include "QThread" #include "QDebug" #include "QPicture" #include "QtMath" +#include Cockpit::Cockpit(QWidget *parent): QWidget(parent) diff --git a/opmap/mapwidget/circlepointitem.cpp b/opmap/mapwidget/circlepointitem.cpp new file mode 100644 index 0000000..9240b3e --- /dev/null +++ b/opmap/mapwidget/circlepointitem.cpp @@ -0,0 +1,166 @@ +#include "circlepointitem.h" +#include "math.h" +#include "qgraphicssceneevent.h" +#include "qgraphicsview.h" + +#define _USE_MATH_DEFINES + +CirclePointItem::CirclePointItem(mapcontrol::MapGraphicItem *map, QPointF const &p) : + QGraphicsEllipseItem(map) +{ + this->setAcceptHoverEvents(true); + _parentMap = map; + setPos(p); + + //参数框 + paramItem = new WayPointParamDialog; + QPointF screenPos = this->screenPos(pos() ); + paramItem->move(screenPos.x() + 10, screenPos.y() ); + + //外圆 + outside = new QGraphicsEllipseItem(-25, -25, 50, 50, this); + QPen pen(QColor(255, 128, 0) ); + pen.setWidth(2); + outside->setPen(pen); + + setBrush(QColor(25, 251, 255) ); + QPen pen1 = this->pen(); + pen1.setColor(QColor(25, 251, 255) ); + setPen(pen1); + setRect(-10, -10, 20, 20); + +// setAcceptDrops(true); +// setEnabled(true); +// this->setFlag(QGraphicsItem::ItemIgnoresTransformations, true); +// this->setFlag(QGraphicsItem::ItemIsSelectable, true); +// this->setFlag(QGraphicsItem::ItemIsMovable, true); + + connect(paramItem, &WayPointParamDialog::ok, this, &CirclePointItem::acceptedSlot, Qt::DirectConnection ); + connect(paramItem, SIGNAL(ok() ), this, SIGNAL(accepted() ), Qt::DirectConnection ); + connect(paramItem, SIGNAL(cancel() ), this, SIGNAL(rejected() ), Qt::DirectConnection ); + connect(paramItem, &WayPointParamDialog::remove, + this, [this](){ this->isRemove = true;}, Qt::DirectConnection ); + + connect(map, &mapcontrol::MapGraphicItem::childRefreshPosition, this, &CirclePointItem::refreshPos); + connect(map, &mapcontrol::MapGraphicItem::childRefreshPosition, this, &CirclePointItem::refreshOutSideEllipse); + + +} + +CirclePointItem::~CirclePointItem() +{ + delete paramItem; +} + +void CirclePointItem::autoParamDialogExex() const +{ +// QScreen *screen = qApp->primaryScreen(); + QScreen *screen = paramItem->screen(); + QPointF wayScreenPos(screenPos(mapToParent(QPointF(0, 0) ) ) ); + QPoint showPos(wayScreenPos.x(), wayScreenPos.y() ); + + if( ((int)showPos.y() + this->paramItem->size().height() ) > screen->size().height() ) + { + showPos.setY(showPos.y() - paramItem->size().height() - 30); + } + + + + paramItem->move(showPos); + paramItem->exec(); +} + +QPointF CirclePointItem::screenPos(QPointF const &pos) const +{ + QGraphicsItem *map = parentItem(); //获取map + QPointF scenePos = map->mapToScene(pos ); //获取pos在scene中的位置 + QList views = map->scene()->views(); + QPointF viewPos = views[0]->mapFromScene(scenePos); //获取航点在view中的位置 + + return views[0]->mapToGlobal(QPoint(viewPos.x(), viewPos.y() ) ); //返回pos在屏幕中的位置 +} + +int CirclePointItem::radiusPixelLength(double angle) const +{ + double const arc = 6371393; + + //根据角度计算加上距离之后的经纬度 + internals::PointLatLng temp = latLng; + double a = outsideRadius * qSin(angle) / (arc * qCos(latLng.Lat() ) * 2 * M_PI / 360); + double b = outsideRadius * qCos(angle) / (arc * 2 * M_PI / 360); + temp.SetLng(temp.Lng() + a); + temp.SetLat(temp.Lat() + b); + + //把经纬度转换成map中的坐标系 + QPointF origin(_parentMap->FromLatLngToLocal(latLng).X(), _parentMap->FromLatLngToLocal(latLng).Y() ); + QPointF end(_parentMap->FromLatLngToLocal(temp).X(), _parentMap->FromLatLngToLocal(temp).Y() ); + +// //把map坐标系转换成屏幕坐标系 +// origin = screenPos(origin); //错误,当外圆半径太大时,无法计算 +// end = screenPos(end); + + QLineF line(origin, end); + + return line.length(); +} + +void CirclePointItem::refreshOutSideEllipse() +{ + int rad = radiusPixelLength(0); //获取外圆的像素半径 + outside->setRect(-rad, -rad, rad * 2, rad * 2); //重新调整大小 + outside->update(); //重新绘制圆 +} + +void CirclePointItem::setCircleEdit(bool v) +{ + this->isCircleEdit = v; +// this->setFlag(QGraphicsItem::ItemIsSelectable, v); +// setFlag(QGraphicsItem::ItemIsMovable, v); + +} + +void CirclePointItem::setLngLat(double lng, double lat) +{ + this->latLng.SetLat(lat); + this->latLng.SetLng(lng); + + paramItem->setlngLat(lng, lat); +} + +void CirclePointItem::acceptedSlot() +{ + qDebug() << u8"circlePointItem: acceptedSlot"; + + height = paramItem->height; //获取高度 + outsideRadius = paramItem->outsideRadius * 1000; //获取外圆半径 + direction = paramItem->direction; //获取方向 + //获取经纬度 + latLng.SetLat(paramItem->latitude); + latLng.SetLng(paramItem->longitude); + QPointF mapPos(_parentMap->FromLatLngToLocal(latLng).X(), _parentMap->FromLatLngToLocal(latLng).Y() ); //把经纬度转换成在map中的位置 + setPos(mapPos); + + refreshOutSideEllipse(); +} + +void CirclePointItem::refreshPos() +{ + core::Point point = _parentMap->FromLatLngToLocal(this->latLng); + setPos(point.X(), point.Y() ); +} + +void CirclePointItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) +{ + if(isCircleEdit) + { + autoParamDialogExex(); + } +} + +void CirclePointItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + QGraphicsEllipseItem::paint(painter, option, widget); +} + + + diff --git a/opmap/mapwidget/circlepointitem.h b/opmap/mapwidget/circlepointitem.h new file mode 100644 index 0000000..bdc1b5a --- /dev/null +++ b/opmap/mapwidget/circlepointitem.h @@ -0,0 +1,84 @@ +#ifndef CIRCLEPOINTITEM_H +#define CIRCLEPOINTITEM_H + +#include "mapgraphicitem.h" +#include "waypointparamdialog.h" +#include +#include +#include "qapplication.h" +#include + +class CirclePointItem : public QObject, public QGraphicsEllipseItem +{ + Q_OBJECT +public: + enum { Type = UserType + 13 }; + + CirclePointItem(mapcontrol::MapGraphicItem *map, QPointF const &p); + ~CirclePointItem(); + + virtual int type() const override + { + return Type; + } + + void autoParamDialogExex() const; //根据航点所在位置显示对话框 + + bool paramDialogExec() const //以模态的方式显示参数对话框 + { + autoParamDialogExex(); + + return paramItem->isOk; + } + + QPointF screenPos(QPointF const &pos) const; //返回pos在屏幕中的位置,pos只能是map(地图图形项)中的局部坐标 + int radiusPixelLength(double angle) const; //计算外圆在地图上的像素半径 + void setCircleEdit(bool v); + void setLngLat(double lng, double lat); //设置经纬度 + bool getIsRemove() const + { + return isRemove; + } + + double getHeight() const + { + return height; + } + + internals::PointLatLng getLatLng() const + { + return latLng; + } + + double getRadius() const + { + return outsideRadius * direction; + } + +public slots: + void acceptedSlot(); + void refreshPos(); + void refreshOutSideEllipse(); //刷新外圆 + +signals: + void accepted(); + void rejected(); + void remove(); + +protected: + void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; //在航点上右击显示参数对话框 + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = Q_NULLPTR) override; + +private: + bool isRemove = false; + bool isCircleEdit = true; + double height; //高度 + double outsideRadius;//外圈半径,单位:米 + int direction; //方向,-1左盘旋,1右盘旋 + internals::PointLatLng latLng; //经纬度 + mapcontrol::MapGraphicItem *_parentMap; //行单所在的地图 + QGraphicsEllipseItem *outside; //外圆 + WayPointParamDialog *paramItem; //航点参数框 +}; + +#endif // CIRCLEPOINTITEM_H diff --git a/opmap/mapwidget/mapgraphicitem.cpp b/opmap/mapwidget/mapgraphicitem.cpp index e16d5a3..f6ef959 100644 --- a/opmap/mapwidget/mapgraphicitem.cpp +++ b/opmap/mapwidget/mapgraphicitem.cpp @@ -200,6 +200,10 @@ void MapGraphicItem::mousePressEvent(QGraphicsSceneMouseEvent *event) selectionEnd = internals::PointLatLng::Empty; selectionStart = FromLocalToLatLng(event->pos().x(), event->pos().y()); } + else + { +// QGraphicsItem::mousePressEvent(event); + } } } void MapGraphicItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) @@ -297,6 +301,7 @@ void MapGraphicItem::wheelEvent(QGraphicsSceneWheelEvent *event) core->MouseWheelZooming = false; } + } void MapGraphicItem::DrawMap2D(QPainter *painter) { diff --git a/opmap/mapwidget/mapwidget.pro b/opmap/mapwidget/mapwidget.pro index 83ce541..9678b54 100644 --- a/opmap/mapwidget/mapwidget.pro +++ b/opmap/mapwidget/mapwidget.pro @@ -51,10 +51,14 @@ SOURCES += $$PWD/mapgraphicitem.cpp \ $$PWD/AltitudeItem.cpp \ $$PWD/waypointbutton.cpp \ $$PWD/waypointsetting.cpp \ + circlepointitem.cpp \ geoFencecircle.cpp \ geoFenceitem.cpp \ geoFenceitemline.cpp \ - measureline.cpp + measureline.cpp \ + waypointparamdialog.cpp \ + waypointparamitem.cpp \ + waypointparammenu.cpp HEADERS += $$PWD/mapgraphicitem.h \ $$PWD/opmapwidget.h \ @@ -75,15 +79,21 @@ HEADERS += $$PWD/mapgraphicitem.h \ $$PWD/AltitudeItem.h \ $$PWD/waypointbutton.h \ $$PWD/waypointsetting.h \ + circlepointitem.h \ geoFencecircle.h \ geoFenceitem.h \ geoFenceitemline.h \ - measureline.h + measureline.h \ + waypointparamdialog.h \ + waypointparamitem.h \ + waypointparammenu.h RESOURCES += mapresources.qrc FORMS += \ - $$PWD/mapripform.ui + $$PWD/mapripform.ui \ + waypointparamdialog.ui \ + waypointparammenu.ui INCLUDEPATH += $$DESTDIR/include diff --git a/opmap/mapwidget/opmapwidget.cpp b/opmap/mapwidget/opmapwidget.cpp index 460a323..672d993 100644 --- a/opmap/mapwidget/opmapwidget.cpp +++ b/opmap/mapwidget/opmapwidget.cpp @@ -1,4 +1,4 @@ -/** +/** ****************************************************************************** * * @file opmapwidget.cpp @@ -163,8 +163,8 @@ OPMapWidget::OPMapWidget(QWidget *parent, Configuration *config) : QGraphicsView point_begin.SetLat(0); point_begin.SetLng(0); - point_end.SetLat(1); - point_end.SetLng(1); + point_end.SetLat(100); + point_end.SetLng(100); measureline = new MeasureLine(point_begin, point_end, map, QColor("#FFFF00")); mscene.addItem(measureline); @@ -634,6 +634,19 @@ OPMapWidget::~OPMapWidget() } } } + +void OPMapWidget::setCircleEdit(bool v) +{ + foreach(QGraphicsItem *item, map->childItems() ) + { + CirclePointItem *i = qgraphicsitem_cast(item); + if(i) + { + i->setCircleEdit(v); + } + } +} + void OPMapWidget::closeEvent(QCloseEvent *event) { core->OnMapClose(); @@ -872,7 +885,58 @@ void OPMapWidget::mouseDoubleClickEvent(QMouseEvent *event) + if(isCircleCreate) //生成盘旋点 + { + if(event->button() == Qt::LeftButton) + { + QPointF p = event->pos(); + p = map->mapFromParent(p); + internals::PointLatLng temp = map->FromLocalToLatLng(p.x(), p.y() ); + +// CirclePointItem *item = new CirclePointItem(map, p); + CirclePointItem *item = new CirclePointItem(map, p); + + item->setLngLat(temp.Lng(), temp.Lat() ); + + + + + bool isCircleRemove = !item->paramDialogExec(); + + if(isCircleRemove) + { + delete item; + } + else + { + connect(item, &CirclePointItem::rejected, + this, [this]() + { + QObject *temp = sender(); + CirclePointItem *item = qobject_cast(temp); + + item->setParentItem(nullptr); + item->setCircleEdit(false); + connect(item, nullptr, nullptr, nullptr); + item->deleteLater(); + }); + + connect(item, &CirclePointItem::accepted, + this, [this, item]() + { + double radius = item->getRadius(); + internals::PointLatLng latLng = item->getLatLng(); + emit cmd_long( 0,0,radius,0, latLng.Lat(), latLng.Lng(),0,0,0); + }); + } + + + + + + } + } isLNOP = false; @@ -891,18 +955,33 @@ void OPMapWidget::mouseDoubleClickEvent(QMouseEvent *event) WayPointItem *Item = WPCreate(LatLng,50); - foreach(QGraphicsItem * i, map->childItems()) { - WayPointItem *w = qgraphicsitem_cast(i); - if (w) { - if (w->MissionType() == Item->MissionType()) { - if(w->Number() == (Item->Number() - 1)) + qDebug() << "opmapwidget : isWayPointCreate:" << isWayPointCreate; + + +// if(isWayPointCreate) +// { + foreach(QGraphicsItem * i, map->childItems()) + { + WayPointItem *w = qgraphicsitem_cast(i); + + if (w) + { + if (w->MissionType() == Item->MissionType()) { - WPLineCreate(w,Item,Qt::green,false,2); + if(w->Number() == (Item->Number() - 1)) + { + WPLineCreate(w,Item,Qt::green,false,2); + } } } } - } + +// } +// else +// { +// delete Item; +// } } } } @@ -3708,4 +3787,5 @@ void OPMapWidget::WPShowTip(bool flag) } + } diff --git a/opmap/mapwidget/opmapwidget.h b/opmap/mapwidget/opmapwidget.h index 15d453d..80ff4f7 100644 --- a/opmap/mapwidget/opmapwidget.h +++ b/opmap/mapwidget/opmapwidget.h @@ -1,4 +1,4 @@ -/** +/** ****************************************************************************** * * @file opmapwidget.h @@ -52,6 +52,7 @@ #include "QTextStream" #include +#include "circlepointitem.h" #include "waypointbutton.h" @@ -98,6 +99,8 @@ class Helper { public: + + static MapType::Types MapTypeFromString(QString const & value) { return MapType::TypeByStr(value); @@ -234,6 +237,9 @@ public: OPMapWidget(QWidget *parent = 0, Configuration *config = new Configuration); ~OPMapWidget(); + void setCircleEdit(bool v); + + void refreshAllCirclePoint(); //刷新盘旋点外圆 bool ShowTileGridLines() const { @@ -469,6 +475,16 @@ public: + bool circleCreate() const + { + return isCircleCreate; + } + + void setCircleCreate(bool v) + { + isCircleCreate = v; + } + private: internals::Core *core; @@ -489,6 +505,8 @@ private: bool showDiag; qreal overlayOpacity; + bool isCircleCreate = true; //是否创建盘旋点 + bool isWayPointCreate = true; bool isWPCreate; bool isWPLock; bool isLNOP = false; @@ -535,7 +553,7 @@ protected: // private slots: signals: - + void cmd_long( float param1,float param2,float param3,float param4,float param5,float param6,float param7,uint16_t command,uint8_t confirmation); void cancelRequest(); void percentageChanged(int const & perc); void numberOfTilesChanged(int const & total, int const & actual); diff --git a/opmap/mapwidget/waypointitem.cpp b/opmap/mapwidget/waypointitem.cpp index b67624e..412ea93 100644 --- a/opmap/mapwidget/waypointitem.cpp +++ b/opmap/mapwidget/waypointitem.cpp @@ -1,4 +1,4 @@ -/** +/** ****************************************************************************** * * @file waypointitem.cpp @@ -32,6 +32,8 @@ #include "QJsonDocument" #include "QJsonObject" #include "QJsonParseError" +#include +#include namespace mapcontrol { @@ -72,6 +74,15 @@ WayPointItem::WayPointItem(const internals::PointLatLng &coord, int const & alti connect(map, SIGNAL(childRefreshPosition()), this, SLOT(RefreshPos())); connect(map, SIGNAL(childSetOpacity(qreal)), this, SLOT(setOpacitySlot(qreal))); + +// paramItem = new WayPointParamItem(this); +// paramItem->setPos(20, 20); + + + + + + this->setZValue(4); } @@ -122,6 +133,9 @@ WayPointItem::WayPointItem(int seq,int missiontype, MapGraphicItem *map, bool ma connect(map, SIGNAL(childRefreshPosition()), this, SLOT(RefreshPos())); connect(map, SIGNAL(childSetOpacity(qreal)), this, SLOT(setOpacitySlot(qreal))); + setParentItem(map); + + this->setZValue(4); } WayPointItem::WayPointItem(const internals::PointLatLng &coord, int const & altitude,int seq, int missiontype, const QString &description, MapGraphicItem *map, wptype type) : coord(coord), reached(false), description(description), shownumber(true), isDragging(false), altitude(altitude), map(map), myType(type) @@ -162,6 +176,9 @@ WayPointItem::WayPointItem(const internals::PointLatLng &coord, int const & alti connect(map, SIGNAL(childRefreshPosition()), this, SLOT(RefreshPos())); connect(map, SIGNAL(childSetOpacity(qreal)), this, SLOT(setOpacitySlot(qreal))); + setParentItem(map); + + this->setZValue(4); } @@ -202,9 +219,23 @@ WayPointItem::WayPointItem(const distBearingAltitude &relativeCoordenate,int seq connect(map, SIGNAL(childRefreshPosition()), this, SLOT(RefreshPos())); connect(map, SIGNAL(childSetOpacity(qreal)), this, SLOT(setOpacitySlot(qreal))); + setParentItem(map); + + this->setZValue(4); } +//QPointF WayPointItem::screenPos() const +//{ +// QGraphicsItem *map = parentItem(); //获取map +// QPointF scenePos = map->mapToScene(pos() ); //获取航点在scene中的位置 +// QList views = map->scene()->views(); +// QPointF viewPos = views[0]->mapFromScene(scenePos); //获取航点在view中的位置 + +// return views[0]->mapToGlobal(QPoint(viewPos.x(), viewPos.y() ) ); //返回航点在屏幕中的位置 + +//} + void WayPointItem::setWPType(wptype type) { myType = type; @@ -518,6 +549,8 @@ void WayPointItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) //qInfo() << "DoubleClickEvent"; emit waypointdoubleclick(this); } + + QGraphicsItem::mouseDoubleClickEvent(event); } void WayPointItem::mousePressEvent(QGraphicsSceneMouseEvent *event) @@ -535,6 +568,8 @@ void WayPointItem::mousePressEvent(QGraphicsSceneMouseEvent *event) } QGraphicsItem::mousePressEvent(event); + + qDebug() << "waypointitem: press"; update(); } void WayPointItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) @@ -632,6 +667,28 @@ void WayPointItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) update(); } +QVariant WayPointItem::itemChange(GraphicsItemChange change, const QVariant &value) +{ + if(change == ItemPositionChange) + { + + qDebug() << "航点位置发生变化"; + } + + return QGraphicsItem::itemChange(change, value); +} + +//void WayPointItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) +//{ +//// if(this->_isUseParamDialog) +//// { +//// paramItem->exec(); +////// QPointF tempPos = this->screenPos(); + +//// paramItem->move(QPoint(event->screenPos().x() + 10, event->screenPos().y() + 10) ); +//// } +//} + void WayPointItem::setPosition(QPointF p) { @@ -827,6 +884,11 @@ int WayPointItem::type() const WayPointItem::~WayPointItem() { +// if(_isUseParamDialog) +// { +// delete paramItem; +// } + emit aboutToBeDeleted(this); //--WayPointItem::snumber; diff --git a/opmap/mapwidget/waypointitem.h b/opmap/mapwidget/waypointitem.h index e7c8b94..6407f63 100644 --- a/opmap/mapwidget/waypointitem.h +++ b/opmap/mapwidget/waypointitem.h @@ -36,6 +36,8 @@ #include #include "QDebug" #include "mavlink.h" +#include "waypointparamitem.h" +#include "waypointparamdialog.h" //#include "propertyui.h" @@ -105,12 +107,19 @@ public: }_property; - + WayPointItem( ) {} WayPointItem(internals::PointLatLng const & coord, int const & altitude,int seq, int missiontype, MapGraphicItem *map, wptype type = absolute); WayPointItem(int seq,int missiontype, MapGraphicItem *map, bool magicwaypoint); WayPointItem(internals::PointLatLng const & coord, int const & altitude, int seq,int missiontype, QString const & description, MapGraphicItem *map, wptype type = absolute); WayPointItem(distBearingAltitude const & relativeCoord,int seq, int missiontype, QString const & description, MapGraphicItem *map); +// void paramDialogExec() const //以模态的方式显示参数对话框 +// { +// paramItem->exec(); +// } + +// QPointF screenPos() const; //返回航点在屏幕中的位置 + QString Description() { return description; @@ -316,6 +325,12 @@ public: return isFancy; } + + MapGraphicItem* getMap() const + { + return this->map; + } + protected: void mouseMoveEvent(QGraphicsSceneMouseEvent *event); void mousePressEvent(QGraphicsSceneMouseEvent *event); @@ -323,8 +338,10 @@ protected: void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); void hoverEnterEvent(QGraphicsSceneHoverEvent *event); void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); -private: + QVariant itemChange(GraphicsItemChange change, QVariant const &value) override; +// void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; +private: _property property; qreal TipOpacity = 0.5; @@ -416,6 +433,8 @@ public slots: void ElevationUpdate(QNetworkReply *reply); signals: +// void accepted(); +// void rejected(); void currentMissiontype(int group); void SetCurrent(int group,int seq); diff --git a/opmap/mapwidget/waypointparamdialog.cpp b/opmap/mapwidget/waypointparamdialog.cpp new file mode 100644 index 0000000..b9beaa5 --- /dev/null +++ b/opmap/mapwidget/waypointparamdialog.cpp @@ -0,0 +1,54 @@ +#include "waypointparamdialog.h" +#include "ui_waypointparamdialog.h" +#include +#include + +WayPointParamDialog::WayPointParamDialog(QWidget *parent, Qt::WindowFlags f) : + QDialog(parent, f), + ui(new Ui::WayPointParamDialog) +{ + ui->setupUi(this); + + setWindowFlag(Qt::FramelessWindowHint); + setWindowFlag(Qt::SubWindow); + +// connect(ui->buttonBox, &QDialogButtonBox::accepted, this, [=](){ emit ok(); }, Qt::DirectConnection ); + connect(ui->buttonBox, &QDialogButtonBox::rejected, this, [=](){ isOk = false; emit cancel(); }, Qt::DirectConnection ); + connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &WayPointParamDialog::acceptedSlot); + connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &WayPointParamDialog::setButtonString); +} + +WayPointParamDialog::~WayPointParamDialog() +{ + delete ui; +} + +void WayPointParamDialog::setlngLat(double lng, double lat) +{ + this->longitude = lng; + this->latitude = lat; + ui->dSpinLongitude->setValue(lng); + ui->dSpinLatitude->setValue(lat); +} + +void WayPointParamDialog::setButtonString() +{ + QPushButton *btn = ui->buttonBox->button(QDialogButtonBox::Cancel); + btn->setText("delete"); + disconnect(ui->buttonBox, &QDialogButtonBox::accepted, this, &WayPointParamDialog::setButtonString); + connect(ui->buttonBox, &QDialogButtonBox::rejected, this, [this](){ emit remove(); } ); +} + +void WayPointParamDialog::acceptedSlot() +{ + isOk = true; + this->height = ui->dSpinHeight->value(); + outsideRadius = ui->dSpinRadius->value(); + direction = ui->comBoxDirection->currentIndex() == 0 ? 1 : -1; //方向,-1左盘旋,1右盘旋 + longitude = ui->dSpinLongitude->value(); //经度 + latitude = ui->dSpinLatitude->value(); //纬度 + + emit ok(); +} + + diff --git a/opmap/mapwidget/waypointparamdialog.h b/opmap/mapwidget/waypointparamdialog.h new file mode 100644 index 0000000..86ea901 --- /dev/null +++ b/opmap/mapwidget/waypointparamdialog.h @@ -0,0 +1,39 @@ +#ifndef WAYPOINTPARAMDIALOG_H +#define WAYPOINTPARAMDIALOG_H + +#include + +namespace Ui { +class WayPointParamDialog; +} + +struct WayPointParamDialog : public QDialog +{ + Q_OBJECT + +public: + explicit WayPointParamDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags() ); + ~WayPointParamDialog(); + bool isOk = false; + double height; //高度 + double outsideRadius;//外圈半径 + double direction; //方向,-1左盘旋,1右盘旋 + double longitude; //经度 + double latitude; //纬度 + + void setlngLat(double lng, double lat); //设置经纬度,并且把对话框上面的值进行修改 + +signals: + void ok(); + void cancel(); + void remove(); + +private slots: + void acceptedSlot(); + void setButtonString(); //把取消按钮设置成删除 + +private: + Ui::WayPointParamDialog *ui; +}; + +#endif // WAYPOINTPARAMDIALOG_H diff --git a/opmap/mapwidget/waypointparamdialog.ui b/opmap/mapwidget/waypointparamdialog.ui new file mode 100644 index 0000000..cdc137d --- /dev/null +++ b/opmap/mapwidget/waypointparamdialog.ui @@ -0,0 +1,204 @@ + + + WayPointParamDialog + + + + 0 + 0 + 248 + 174 + + + + Dialog + + + + 5 + + + 0 + + + 5 + + + 0 + + + 0 + + + + + ° + + + 6 + + + -100000000.000000000000000 + + + 100000000.000000000000000 + + + + + + + + 16777215 + 25 + + + + 方向: + + + + + + + 半径: + + + + + + + + 40 + 16777215 + + + + 高度 + + + + + + + + + + km + + + 0.000000000000000 + + + 10000000.000000000000000 + + + + + + + m + + + -10000000.000000000000000 + + + 100000000.000000000000000 + + + + + + + 纬度 + + + + + + + ° + + + 6 + + + -10000000.000000000000000 + + + 100000000.000000000000000 + + + + + + + 经度: + + + + + + + + 右盘旋 + + + + + 左盘旋 + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + WayPointParamDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + WayPointParamDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/opmap/mapwidget/waypointparamitem.cpp b/opmap/mapwidget/waypointparamitem.cpp new file mode 100644 index 0000000..71f30bb --- /dev/null +++ b/opmap/mapwidget/waypointparamitem.cpp @@ -0,0 +1,13 @@ +#include "waypointparamitem.h" +#include + +WayPointParamItem::WayPointParamItem(QGraphicsItem *parent, Qt::WindowFlags wFlags) : + QGraphicsProxyWidget(parent, wFlags) +{ + dialog = new WayPointParamDialog(); + setWidget(dialog); +// setWindowFlags(dialog->windowFlags() ); +// this->setWindowTitle(u8"参数:"); +// dialog->setWindowIcon(QIcon() ); + +} diff --git a/opmap/mapwidget/waypointparamitem.h b/opmap/mapwidget/waypointparamitem.h new file mode 100644 index 0000000..97f00f7 --- /dev/null +++ b/opmap/mapwidget/waypointparamitem.h @@ -0,0 +1,19 @@ +#ifndef WAYPOINTPARAMITEM_H +#define WAYPOINTPARAMITEM_H + +#include +#include +#include "waypointparamdialog.h" + +class WayPointParamItem : public QGraphicsProxyWidget +{ +public: + WayPointParamItem(QGraphicsItem *parent = Q_NULLPTR, Qt::WindowFlags wFlags = Qt::WindowFlags() ); + + + +private: + WayPointParamDialog *dialog; +}; + +#endif // WAYPOINTPARAMITEM_H diff --git a/opmap/mapwidget/waypointparammenu.cpp b/opmap/mapwidget/waypointparammenu.cpp new file mode 100644 index 0000000..d049ca1 --- /dev/null +++ b/opmap/mapwidget/waypointparammenu.cpp @@ -0,0 +1,14 @@ +#include "waypointparammenu.h" +#include "ui_waypointparammenu.h" + +WayPointParamMenu::WayPointParamMenu(QWidget *parent) : + QWidget(parent), + ui(new Ui::WayPointParamMenu) +{ + ui->setupUi(this); +} + +WayPointParamMenu::~WayPointParamMenu() +{ + delete ui; +} diff --git a/opmap/mapwidget/waypointparammenu.h b/opmap/mapwidget/waypointparammenu.h new file mode 100644 index 0000000..4232bee --- /dev/null +++ b/opmap/mapwidget/waypointparammenu.h @@ -0,0 +1,22 @@ +#ifndef WAYPOINTPARAMMENU_H +#define WAYPOINTPARAMMENU_H + +#include + +namespace Ui { +class WayPointParamMenu; +} + +class WayPointParamMenu : public QWidget +{ + Q_OBJECT + +public: + explicit WayPointParamMenu(QWidget *parent = nullptr); + ~WayPointParamMenu(); + +private: + Ui::WayPointParamMenu *ui; +}; + +#endif // WAYPOINTPARAMMENU_H diff --git a/opmap/mapwidget/waypointparammenu.ui b/opmap/mapwidget/waypointparammenu.ui new file mode 100644 index 0000000..7f1da6e --- /dev/null +++ b/opmap/mapwidget/waypointparammenu.ui @@ -0,0 +1,21 @@ + + + + + WayPointParamMenu + + + + 0 + 0 + 400 + 300 + + + + Form + + + + +