fix(radar): 导入入口从隐藏菜单栏改到三维体段头按钮(app无原生菜单栏)

根因:app 经 window.setMenuWidget(TopBar) 占用 QMainWindow 菜单栏槽位,
原生 QMenuBar 不显示(全 app 无菜单栏),故 Task8 放在 menuBar() 的「三维雷达」
菜单根本看不到。
修复:入口迁到三维体(voxel)段头「+ 导入雷达测线」按钮(QToolButton+InstantPopup,
镜像现有「+新增三维体」),弹出 规范化(.head/.data)/Impulse(.iprb) 两项 →
CategorySection.radarImportRequested(impulse) → CategoryAnalysisTab 转发 →
main.cpp 走原导入流程。删除死的 menuBar 代码 + QMenuBar include。
This commit is contained in:
gaozheng 2026-06-29 15:13:53 +08:00
parent e48b679255
commit 63ab099f76
5 changed files with 58 additions and 33 deletions

View File

@ -52,7 +52,6 @@
#include <QJsonObject>
#include <QLibraryInfo>
#include <QMenu>
#include <QMenuBar>
#include <QMessageBox>
#include <QPoint>
#include <QSet>
@ -981,12 +980,13 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
analysisTab->scrollItemToTop(qid); // 新三维体行尽量滚到分析栏顶部
});
});
// 本地导入三维雷达测线目录(后端未就绪的过渡入口):选目录+前缀 → registerRadarDataset(登记dd_radar_3d DS) → 勾选→后台建体渲染。
{
QMenu* radarMenu = window.menuBar()->addMenu(QStringLiteral("三维雷达"));
QAction* importAct = radarMenu->addAction(QStringLiteral("导入测线目录(本地)…"));
QObject::connect(importAct, &QAction::triggered, &window,
[&window, scene3dRepo, refreshAnalysis, analysisTab]() {
// 本地导入三维雷达测线(后端未就绪的过渡入口):入口=三维体段头「+ 导入雷达测线」按钮(CategorySection)
// → analysisTab.radarImportRequested(impulse)。app 无原生菜单栏(menuBar 被 TopBar 经 setMenuWidget 占用),
// 故入口放可见的段头按钮。impulse=false 走规范化(.head/.data, 懒加载后台建体)true 走 Impulse(.iprb, eager)。
QObject::connect(
analysisTab, &geopro::app::CategoryAnalysisTab::radarImportRequested, &window,
[&window, scene3dRepo, refreshAnalysis, analysisTab, vtkLoading](bool impulse) {
if (!impulse) { // 规范化 .head/.data → registerRadarDataset(dd_radar_3d, 懒加载后台建体)
const QString dir = QFileDialog::getExistingDirectory(
&window, QStringLiteral("选择规范化三维雷达测线目录(含 *.head/*.data)"));
if (dir.isEmpty()) return;
@ -1002,15 +1002,11 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
{ const QSignalBlocker block(analysisTab); refreshAnalysis(); } // DS 进三维体段(不触发渲染)
const QString qid = QString::fromStdString(newId);
analysisTab->setItemChecked(qid, true); // 勾选 → addDatasetAsync → loadVolume 后台建体渲染
analysisTab->setItemBusy(qid, true); // spinner; 渲染完成由 datasetRendered 撤(main.cpp:987)
analysisTab->setItemBusy(qid, true); // spinner; 渲染完成由 datasetRendered 撤
analysisTab->scrollItemToTop(qid);
});
// 明星路 Impulse(.iprb) 本地导入:复用现成 createGprVolume(eager 同步建体,预填 cachedGrid)。
// 双数据集互证:证下游渲染/切片/异常对 14ch(Impulse)/16ch(Mala) 几何无关。
QAction* importImpulseAct =
radarMenu->addAction(QStringLiteral("导入Impulse测线目录(.iprb)…"));
QObject::connect(importImpulseAct, &QAction::triggered, &window,
[&window, scene3dRepo, refreshAnalysis, analysisTab, vtkLoading]() {
return;
}
// 明星路 Impulse(.iprb):复用现成 createGprVolume(eager 同步建体,预填 cachedGrid)。双数据集互证下游几何无关。
const QString dir = QFileDialog::getExistingDirectory(
&window, QStringLiteral("选择 Impulse 测线目录(含 *.iprb/*.ord)"));
if (dir.isEmpty()) return;
@ -1037,12 +1033,11 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
vtkLoading->hide();
const QString qid = QString::fromStdString(newId);
// createGprVolume 预填 cachedGrid → setItemChecked 内 loadVolume 同步渲染、datasetRendered 自动撤 busy
// 故此处【不要】再 setItemBusy(true)(否则 spinner 永久转圈 —— 评审 MEDIUM)。
// 故此处【不要】再 setItemBusy(true)(否则 spinner 永久转圈)。
analysisTab->setItemChecked(qid, true);
analysisTab->scrollItemToTop(qid);
});
});
}
// 任一数据集(剖面/体)异步加载开始 → 列表项复选框转等待 spinner渲染完成 → 复原复选框。
// 覆盖非三维体:勾选剖面首次渲染较慢时也有等待反馈(用户反馈)。
QObject::connect(sceneCtrl, &geopro::controller::VtkSceneController::datasetLoading, analysisTab,

View File

@ -47,6 +47,8 @@ CategoryAnalysisTab::CategoryAnalysisTab(geopro::data::DatasetFieldDictionary* d
});
connect(sec, &CategorySection::generateVolumeRequested, this,
&CategoryAnalysisTab::generateVolumeRequested);
connect(sec, &CategorySection::radarImportRequested, this,
&CategoryAnalysisTab::radarImportRequested);
connect(sec, &CategorySection::detailRequested, this, &CategoryAnalysisTab::detailRequested);
connect(sec, &CategorySection::deleteDatasetRequested, this,
&CategoryAnalysisTab::deleteDatasetRequested);

View File

@ -39,6 +39,7 @@ public:
signals:
void checkedDatasetsChanged(const QStringList& dsIds); // 5 段勾选并集
void generateVolumeRequested(const QString& dsTypeCode, const QStringList& sourceDsIds);
void radarImportRequested(bool impulse); // 三维体段头「+导入雷达测线」(false=规范化, true=Impulse)
void detailRequested(const QString& dsId, const QString& ddCode, const QString& name);
void deleteDatasetRequested(const QString& dsId, const QString& ddCode); // 右键删除切片/异常
// ── 三维体段操作转发(迁自旧 Column3DAnalysis全接──

View File

@ -83,6 +83,32 @@ CategorySection::CategorySection(const CategorySpec& spec, geopro::data::Dataset
});
hl->addWidget(gen);
}
// 三维体段头「+ 导入雷达测线」(后端未就绪的本地过渡入口):弹出菜单选 规范化/Impulse。
// 次级强调按钮样式同「+新增三维体」;点击发 radarImportRequested(impulse) → 上层走导入流程。
if (spec_.id == "voxel") {
auto* imp = new QToolButton(headerRow);
imp->setText(QStringLiteral("+ 导入雷达测线"));
imp->setCursor(Qt::PointingHandCursor);
imp->setPopupMode(QToolButton::InstantPopup);
applyTokenizedStyleSheet(
imp, QStringLiteral(
"QToolButton{border:1px solid {{accent/primary}};border-radius:%1px;"
"color:{{accent/primary}};background:transparent;padding:%2px %3px;font-size:%4px;}"
"QToolButton::menu-indicator{image:none;width:0;}"
"QToolButton:hover{background:{{bg/selected}};}"
"QToolButton:pressed{background:{{bg/hover}};}")
.arg(radius::kSm)
.arg(scaledPx(space::kXxs))
.arg(scaledPx(space::kMd))
.arg(scaledPx(type::kCaption)));
auto* menu = new QMenu(imp);
menu->addAction(QStringLiteral("规范化测线目录(.head/.data)…"), this,
[this] { emit radarImportRequested(false); });
menu->addAction(QStringLiteral("Impulse 测线目录(.iprb)…"), this,
[this] { emit radarImportRequested(true); });
imp->setMenu(menu);
hl->addWidget(imp);
}
root->addWidget(headerRow);
body_ = new QWidget(this);

View File

@ -51,6 +51,7 @@ signals:
void checkedDatasetsChanged(const QStringList& dsIds); // 数据行勾选=渲染
void collapsedChanged(); // 折叠/展开切换 → 外层 CategoryAnalysisTab 重排各段 stretch
void generateVolumeRequested(const QString& dsTypeCode, const QStringList& sourceDsIds); // 段头「+新增三维体」
void radarImportRequested(bool impulse); // 三维体段头「+导入雷达测线」(false=规范化 .head/.data, true=Impulse .iprb)
void detailRequested(const QString& dsId, const QString& ddCode, const QString& name); // 双击/右键=详情
void deleteDatasetRequested(const QString& dsId, const QString& ddCode); // 右键删除(切片/异常)
// ── 三维体段右键操作(迁自旧 Column3DAnalysis全接──