feat(ela): 视图/详情工具条 → ElaToolButton 行(替 QToolBar+QAction)

- 视图工具条(二维地图/三维视图): QToolBar+QActionGroup → QWidget+QHBoxLayout+ElaToolButton+QButtonGroup(互斥)
- 详情工具条(原数据/网格数据 互斥 + 显示异常/电极/等值线 开关): 同上 + QFrame 分隔
- 连接: QAction::triggered→QAbstractButton::clicked, QAction::toggled→QAbstractButton::toggled;
  视图模式/详情模式/叠加显隐 行为保持
- 注: 工具条交互(2D/3D 切换/详情模式/三个显隐开关)为活逻辑, 需运行验证
This commit is contained in:
gaozheng 2026-06-10 10:27:33 +08:00
parent b6e0142d06
commit 3aa4e1bfe2
1 changed files with 56 additions and 30 deletions

View File

@ -31,7 +31,9 @@
#include <QEasingCurve> #include <QEasingCurve>
#include <QEvent> #include <QEvent>
#include <QFile> #include <QFile>
#include <QButtonGroup>
#include <QFrame> #include <QFrame>
#include <QHBoxLayout>
#include <QGraphicsOpacityEffect> #include <QGraphicsOpacityEffect>
#include <QLabel> #include <QLabel>
#include <QModelIndex> #include <QModelIndex>
@ -67,6 +69,7 @@
#include <ElaDef.h> #include <ElaDef.h>
#include <ElaListView.h> #include <ElaListView.h>
#include <ElaTheme.h> #include <ElaTheme.h>
#include <ElaToolButton.h>
#include <ElaWindow.h> #include <ElaWindow.h>
#include "model/ColorScale.hpp" #include "model/ColorScale.hpp"
@ -324,16 +327,24 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
centerLayout->setContentsMargins(0, 0, 0, 0); centerLayout->setContentsMargins(0, 0, 0, 0);
centerLayout->setSpacing(0); centerLayout->setSpacing(0);
// 工具条:「二维地图/三维视图」两个互斥可勾选 action。切换=按当前勾选集重建对应内容。默认二维地图。 // 工具条:「二维地图/三维视图」两个互斥可勾选按钮(Fluent ElaToolButton)。默认二维地图。
auto* viewToolBar = new QToolBar(); auto* viewToolBar = new QWidget();
auto* viewGroup = new QActionGroup(viewToolBar); auto* viewBarLay = new QHBoxLayout(viewToolBar);
viewBarLay->setContentsMargins(8, 6, 8, 6);
viewBarLay->setSpacing(6);
auto* viewGroup = new QButtonGroup(viewToolBar);
viewGroup->setExclusive(true); viewGroup->setExclusive(true);
auto* act2D = viewToolBar->addAction(QStringLiteral("二维地图")); auto* act2D = new ElaToolButton(viewToolBar);
auto* act3D = viewToolBar->addAction(QStringLiteral("三维视图")); act2D->setText(QStringLiteral("二维地"));
act2D->setCheckable(true); act2D->setCheckable(true);
auto* act3D = new ElaToolButton(viewToolBar);
act3D->setText(QStringLiteral("三维视图"));
act3D->setCheckable(true); act3D->setCheckable(true);
viewGroup->addAction(act2D); viewGroup->addButton(act2D);
viewGroup->addAction(act3D); viewGroup->addButton(act3D);
viewBarLay->addWidget(act2D);
viewBarLay->addWidget(act3D);
viewBarLay->addStretch();
act2D->setChecked(true); // 默认二维地图 act2D->setChecked(true); // 默认二维地图
centerLayout->addWidget(viewToolBar); centerLayout->addWidget(viewToolBar);
centerLayout->addWidget(vtkWidget, 1); centerLayout->addWidget(vtkWidget, 1);
@ -462,27 +473,42 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
detailLayout->setContentsMargins(0, 0, 0, 0); detailLayout->setContentsMargins(0, 0, 0, 0);
detailLayout->setSpacing(0); detailLayout->setSpacing(0);
// 工具条对齐原型:「原数据 | 网格数据」互斥 +「显示异常」开关。 // 工具条对齐原型:「原数据 | 网格数据」互斥 +「显示异常/电极/等值线」开关Fluent ElaToolButton
auto* detailToolBar = new QToolBar(); auto* detailToolBar = new QWidget();
auto* detailGroup = new QActionGroup(detailToolBar); auto* detailBarLay = new QHBoxLayout(detailToolBar);
detailBarLay->setContentsMargins(8, 6, 8, 6);
detailBarLay->setSpacing(6);
auto makeBarBtn = [detailToolBar](const QString& text, bool checkable) {
auto* b = new ElaToolButton(detailToolBar);
b->setText(text);
b->setCheckable(checkable);
return b;
};
auto* detailGroup = new QButtonGroup(detailToolBar);
detailGroup->setExclusive(true); detailGroup->setExclusive(true);
auto* actScatter = detailToolBar->addAction(QStringLiteral("原数据")); auto* actScatter = makeBarBtn(QStringLiteral("原数据"), true);
auto* actSection = detailToolBar->addAction(QStringLiteral("网格数据")); auto* actSection = makeBarBtn(QStringLiteral("网格数据"), true);
actScatter->setCheckable(true); detailGroup->addButton(actScatter);
actSection->setCheckable(true); detailGroup->addButton(actSection);
detailGroup->addAction(actScatter); detailBarLay->addWidget(actScatter);
detailGroup->addAction(actSection); detailBarLay->addWidget(actSection);
actSection->setChecked(true); // 默认网格数据 (#18) actSection->setChecked(true); // 默认网格数据 (#18)
detailToolBar->addSeparator(); auto* barSep = new QFrame(detailToolBar);
auto* actShowAnomaly = detailToolBar->addAction(QStringLiteral("显示异常")); barSep->setFrameShape(QFrame::VLine);
actShowAnomaly->setCheckable(true); barSep->setObjectName(QStringLiteral("topDivider"));
detailBarLay->addSpacing(4);
detailBarLay->addWidget(barSep);
detailBarLay->addSpacing(4);
auto* actShowAnomaly = makeBarBtn(QStringLiteral("显示异常"), true);
actShowAnomaly->setChecked(true); // 默认显示异常(对齐原型 ☑显示异常) actShowAnomaly->setChecked(true); // 默认显示异常(对齐原型 ☑显示异常)
auto* actShowElectrodes = detailToolBar->addAction(QStringLiteral("显示电极")); auto* actShowElectrodes = makeBarBtn(QStringLiteral("显示电极"), true);
actShowElectrodes->setCheckable(true);
actShowElectrodes->setChecked(true); // 默认显示电极 ▼(对齐原型) actShowElectrodes->setChecked(true); // 默认显示电极 ▼(对齐原型)
auto* actShowContour = detailToolBar->addAction(QStringLiteral("显示等值线")); auto* actShowContour = makeBarBtn(QStringLiteral("显示等值线"), true);
actShowContour->setCheckable(true);
actShowContour->setChecked(true); // 默认显示等值线(对齐原型) actShowContour->setChecked(true); // 默认显示等值线(对齐原型)
detailBarLay->addWidget(actShowAnomaly);
detailBarLay->addWidget(actShowElectrodes);
detailBarLay->addWidget(actShowContour);
detailBarLay->addStretch();
detailLayout->addWidget(detailToolBar); detailLayout->addWidget(detailToolBar);
detailLayout->addWidget(detailWidget, 1); detailLayout->addWidget(detailWidget, 1);
@ -746,29 +772,29 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
}); });
// ── 数据详情工具条「反演剖面/原数据」:切模式 → 重建数据详情 ── // ── 数据详情工具条「反演剖面/原数据」:切模式 → 重建数据详情 ──
QObject::connect(actSection, &QAction::triggered, detailWidget, QObject::connect(actSection, &QAbstractButton::clicked, detailWidget,
[detailMode, rebuildDetail]() { [detailMode, rebuildDetail]() {
*detailMode = DetailMode::Section18; *detailMode = DetailMode::Section18;
rebuildDetail(); rebuildDetail();
}); });
QObject::connect(actScatter, &QAction::triggered, detailWidget, QObject::connect(actScatter, &QAbstractButton::clicked, detailWidget,
[detailMode, rebuildDetail]() { [detailMode, rebuildDetail]() {
*detailMode = DetailMode::Scatter17; *detailMode = DetailMode::Scatter17;
rebuildDetail(); rebuildDetail();
}); });
// ──「显示异常 / 显示电极 / 显示等值线」开关:切换叠加 → 重建数据详情 ── // ──「显示异常 / 显示电极 / 显示等值线」开关:切换叠加 → 重建数据详情 ──
QObject::connect(actShowAnomaly, &QAction::toggled, detailWidget, QObject::connect(actShowAnomaly, &QAbstractButton::toggled, detailWidget,
[showAnomalies, rebuildDetail](bool on) { [showAnomalies, rebuildDetail](bool on) {
*showAnomalies = on; *showAnomalies = on;
rebuildDetail(); rebuildDetail();
}); });
QObject::connect(actShowElectrodes, &QAction::toggled, detailWidget, QObject::connect(actShowElectrodes, &QAbstractButton::toggled, detailWidget,
[showElectrodes, rebuildDetail](bool on) { [showElectrodes, rebuildDetail](bool on) {
*showElectrodes = on; *showElectrodes = on;
rebuildDetail(); rebuildDetail();
}); });
QObject::connect(actShowContour, &QAction::toggled, detailWidget, QObject::connect(actShowContour, &QAbstractButton::toggled, detailWidget,
[showContour, rebuildDetail](bool on) { [showContour, rebuildDetail](bool on) {
*showContour = on; *showContour = on;
rebuildDetail(); rebuildDetail();
@ -787,13 +813,13 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
}; };
// ── 工具条「二维地图/三维视图」:切换互斥视图 → 重建内容 + 图层浮层显隐 ── // ── 工具条「二维地图/三维视图」:切换互斥视图 → 重建内容 + 图层浮层显隐 ──
QObject::connect(act2D, &QAction::triggered, vtkWidget, QObject::connect(act2D, &QAbstractButton::clicked, vtkWidget,
[viewMode, rebuildCentral, showLayerPanel]() { [viewMode, rebuildCentral, showLayerPanel]() {
*viewMode = ViewMode::Map2D; *viewMode = ViewMode::Map2D;
showLayerPanel(false); showLayerPanel(false);
rebuildCentral(); rebuildCentral();
}); });
QObject::connect(act3D, &QAction::triggered, vtkWidget, QObject::connect(act3D, &QAbstractButton::clicked, vtkWidget,
[viewMode, rebuildCentral, showLayerPanel]() { [viewMode, rebuildCentral, showLayerPanel]() {
*viewMode = ViewMode::View3D; *viewMode = ViewMode::View3D;
showLayerPanel(true); showLayerPanel(true);