geopro/src/app/panels/chart/TrajectoryMapView.cpp

59 lines
1.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "panels/chart/TrajectoryMapView.hpp"
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QUrl>
#include <QVBoxLayout>
#include <QWebEngineView>
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<geopro::core::MapPayload>()) return; // 坏/空 → 忽略
pendingJson_ = pointsToJson(payload.value<geopro::core::MapPayload>());
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