
单频测向插件地图与表盘实现下面按地图/表盘BearingMeter两块说明并单独把paintEvent的“图层”顺序说清楚。1. 地图UIFIXDFPlugin入口InitControl()里给quickWidget加载qrc:/Resource/main.qml从根对象里用findChild找到objectName MapItem的Map后续用QMetaObject::invokeMethod调 QML 上的函数如rotationAngle、setLine、setMarkerLocation等。QML 结构逻辑分层main.qml层次内容根RectangleRootItem地图主体Map { objectName: MapItem }离线Plugin { name: mud }地理要素多个MapQuickItemmapMarker…mapMarker10ImageText编号rotation绑定罗盘、多条MapPolylinebearingLine…bearingLine10示向线、MapCircle目标圈等交互最上层MouseArea铺满MaponPositionChanged里map.toCoordinate发coordinateUpdated与测向相关的 C 调用示例表盘数据同步到地图HandleBearingMeter里更新主标记转角、示向线段、中心跟随等_dfWidget-bearingMeterCtrl-SetData(cData.azimuth, cData.angleProbability, cData.compassAngle, cData.averageValue, cData.maxProbability, cData.levelData, cData.quality); QMetaObject::invokeMethod(mapElement, rotationAngle, Q_ARG(QVariant, cData.compassAngle)); double lat0.05*sin((cData.maxProbability-90)/180*3.1415926*-1) cData.Latitude; double lon0.05*cos((cData.maxProbability-90)/180*3.1415926*-1) cData.Longitude; QMetaObject::invokeMethod(mapElement, setLine, Q_ARG(QVariant, cData.Latitude),Q_ARG(QVariant, cData.Longitude),Q_ARG(QVariant, lat),Q_ARG(QVariant, lon)); QMetaObject::invokeMethod(mapElement, setMarkerLocation,Q_ARG(QVariant, cData.Latitude),Q_ARG(QVariant, cData.Longitude)); if(_isFollowLoctaion)QMetaObject::invokeMethod(mapElement, setMapCenter, Q_ARG(QVariant, cData.Latitude),Q_ARG(QVariant, cData.Longitude));QML 里对应接口主标记转角 主示向线function rotationAngle(angle){ mapMarker.rotation angle180 } function setLine(x1,y1,x2,y2) { bearingLine.path [ QtPositioning.coordinate(x1, y1), QtPositioning.coordinate(x2, y2) ] }结论地图不是 Widget 里的paintEvent而是Qt QuickMap 若干MapQuickItem/MapPolyline与单频测向插件的耦合点是mapElement上的 JS 函数 信号coordinateUpdated。2. 表盘 / 罗盘测向表头——BearingMeterUI 里控件名是bearingMeterCtrl类型为BearingMeterSystemControl/BearingMeter和地图是两个并列控件uifixdfplugin.ui里QQuickWidget与BearingMeter同层 layout表盘全部是单个QWidgetQPainter顺序绘制没有QGraphicsScene/ 多图层对象所谓“图层”就是paintEvent里调用私有Draw*的先后顺序后画的盖住先画的。可视为“图层”的叠放顺序自下而上图例DrawLegend顶部条带红/绿/黄三角示意外框网格drawRect矩形表盘底色与外环DrawGauge绿/红半圆弧角度–幅度极坐标填充DrawAngleLevel内圈圆 蓝色多边形包络十字线DrawCorossLine刻度DrawWatchScale钟表 12 格或DrawAngleScale72 格5° 一档可选DrawConfidenceArea当前实现基本为空指针绿实时DrawRealtime红最优DrawBestBearing黄均值DrawAvgBearing轴心圆点DrawRound方位字 N/E/S/W 小指南针三角DrawSigns车头模式时整体旋转360° - compassAngle车头/正北模式占位DrawNorthBearing/DrawRelativeBearingrotate(_compassAngle)等车体贴图被#if关掉时几乎无视觉概率封闭曲线DrawProbit可选鼠标光标径向线DrawCursorLine圆内跟踪数值面板DrawOptimaValue/DrawCurrValue「方位图」标题侧向电平/质量柱状门限DrawLevelThreshold/DrawQualityThreshold若打开数据更新插件侧SetData(...)写入方位、概率图、compassAngle等并发SignalUpdateUI()→update()触发重绘另外有100msQTimer周期性update()所以表盘会稳定刷新。3. 小结对照项目实现方式地图QQuickWidgetmain.qml的Map要素为MapQuickItem/MapPolyline/MouseArea表盘BearingMeter自定义QWidget无 Scene 图层整屏一架QPainterpaintEvent里按上表顺序Draw*地图与表盘联动同一套cData表盘SetData地图invokeMethod(rotationAngle/setLine/setMarkerLocation/...)