59 lines
1.9 KiB
C++
59 lines
1.9 KiB
C++
#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
|