#include "panels/chart/TrajectoryMapView.hpp" #include #include #include #include #include #include namespace geopro::app { namespace { // MapPayload → 紧凑 JSON 数组串 "[{\"no\":1,\"lon\":..,\"lat\":..}, ...]"(供页面 setPoints)。 QString pointsToJson(const geopro::core::MapPayload& m) { QJsonArray arr; for (const auto& p : m.points) { QJsonObject o; o.insert(QStringLiteral("no"), p.electrodeNo); o.insert(QStringLiteral("lon"), p.lon); o.insert(QStringLiteral("lat"), p.lat); arr.append(o); } return QString::fromUtf8(QJsonDocument(arr).toJson(QJsonDocument::Compact)); } } // namespace TrajectoryMapView::TrajectoryMapView(QWidget* parent) : QWidget(parent) { auto* lay = new QVBoxLayout(this); lay->setContentsMargins(0, 0, 0, 0); lay->setSpacing(0); view_ = new QWebEngineView(this); lay->addWidget(view_, 1); // 页面加载完成 → 标记就绪并注入待推送的点(载荷可能先到)。 QObject::connect(view_, &QWebEngineView::loadFinished, this, [this](bool ok) { pageLoaded_ = ok; if (ok) injectPoints(); }); view_->load(QUrl(QStringLiteral("qrc:/map/trajectory_map.html"))); } void TrajectoryMapView::setPayload(const QVariant& payload) { if (!payload.canConvert()) return; // 坏/空 → 忽略 pendingJson_ = pointsToJson(payload.value()); if (pageLoaded_) injectPoints(); // 页面已就绪则立即注入,否则待 loadFinished } void TrajectoryMapView::injectPoints() { if (!pageLoaded_ || pendingJson_.isEmpty()) return; // 无 QWebChannel:单向经 runJavaScript 调页面侧 setPoints(arr)。 view_->page()->runJavaScript(QStringLiteral("setPoints(%1)").arg(pendingJson_)); } } // namespace geopro::app