refactor/pure-qt-ui #3
|
|
@ -165,4 +165,41 @@ TabbedPanel buildTabbedPanel(const QVector<PanelTab>& tabs, const QVector<Header
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SegmentedHeader buildSegmentedHeader(const QVector<QString>& segments,
|
||||||
|
const QVector<HeaderAction>& actions)
|
||||||
|
{
|
||||||
|
auto* header = new QWidget();
|
||||||
|
header->setObjectName(QStringLiteral("panelHeader"));
|
||||||
|
header->setFixedHeight(kHeaderHeight);
|
||||||
|
geopro::app::applyThemedStyleSheet(header, headerQss());
|
||||||
|
|
||||||
|
auto* hlay = new QHBoxLayout(header);
|
||||||
|
hlay->setContentsMargins(10, 0, 8, 0);
|
||||||
|
hlay->setSpacing(2);
|
||||||
|
|
||||||
|
auto* group = new QButtonGroup(header);
|
||||||
|
group->setExclusive(true);
|
||||||
|
|
||||||
|
SegmentedHeader result;
|
||||||
|
result.header = header;
|
||||||
|
|
||||||
|
for (int i = 0; i < segments.size(); ++i) {
|
||||||
|
auto* btn = new QToolButton(header); // 与异常/属性页签统一: tabBtn 样式 + 强调色下划线
|
||||||
|
btn->setObjectName(QStringLiteral("tabBtn"));
|
||||||
|
btn->setText(segments[i]);
|
||||||
|
btn->setCheckable(true);
|
||||||
|
btn->setCursor(Qt::PointingHandCursor);
|
||||||
|
group->addButton(btn, i);
|
||||||
|
hlay->addWidget(btn);
|
||||||
|
hlay->addSpacing(10);
|
||||||
|
result.buttons.append(btn);
|
||||||
|
}
|
||||||
|
|
||||||
|
hlay->addStretch();
|
||||||
|
for (const auto& a : actions) hlay->addWidget(makeActionButton(header, a));
|
||||||
|
|
||||||
|
if (!result.buttons.isEmpty()) result.buttons[0]->setChecked(true);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace geopro::app
|
} // namespace geopro::app
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
class QWidget;
|
class QWidget;
|
||||||
class QLabel;
|
class QLabel;
|
||||||
|
class QToolButton;
|
||||||
|
|
||||||
namespace geopro::app {
|
namespace geopro::app {
|
||||||
|
|
||||||
|
|
@ -43,4 +44,16 @@ struct TabbedPanel {
|
||||||
TabbedPanel buildTabbedPanel(const QVector<PanelTab>& tabs,
|
TabbedPanel buildTabbedPanel(const QVector<PanelTab>& tabs,
|
||||||
const QVector<HeaderAction>& actions = {});
|
const QVector<HeaderAction>& actions = {});
|
||||||
|
|
||||||
|
// 分段切换表头构建结果:表头容器 + 各分段按钮(互斥,首个默认激活,供调用方接 clicked)。
|
||||||
|
struct SegmentedHeader {
|
||||||
|
QWidget* header;
|
||||||
|
QVector<QToolButton*> buttons;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 构建「分段切换表头」:一行 Tab 风格互斥按钮(与异常/属性页签同款:选中=强调色文字 + 2px
|
||||||
|
// 强调色下划线)+ 右侧操作按钮。表头底/高度/边框与 buildTabbedPanel 完全一致;内容由调用方
|
||||||
|
// 自行 addWidget 到表头下方(不建堆叠,因 2D/3D 共用同一画布部件)。
|
||||||
|
SegmentedHeader buildSegmentedHeader(const QVector<QString>& segments,
|
||||||
|
const QVector<HeaderAction>& actions = {});
|
||||||
|
|
||||||
} // namespace geopro::app
|
} // namespace geopro::app
|
||||||
|
|
|
||||||
|
|
@ -334,27 +334,15 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
|
||||||
.arg(geopro::app::scaledPx(geopro::app::type::kBody))
|
.arg(geopro::app::scaledPx(geopro::app::type::kBody))
|
||||||
.arg(geopro::app::type::kWeightSemibold);
|
.arg(geopro::app::type::kWeightSemibold);
|
||||||
|
|
||||||
// 工具条:「二维地图/三维视图」两个互斥可勾选按钮。默认二维地图。
|
// 「二维地图/三维视图」分段切换表头:与「异常/属性」面板表头同款(42px 表头底 + 强调色下划线页签)。
|
||||||
auto* viewToolBar = new QWidget();
|
auto seg = geopro::app::buildSegmentedHeader(
|
||||||
auto* viewBarLay = new QHBoxLayout(viewToolBar);
|
{QStringLiteral("二维地图"), QStringLiteral("三维视图")},
|
||||||
viewBarLay->setContentsMargins(8, 6, 8, 6);
|
{{geopro::app::Glyph::Collapse, QStringLiteral("折叠")},
|
||||||
viewBarLay->setSpacing(6);
|
{geopro::app::Glyph::Download, QStringLiteral("导出")}});
|
||||||
auto* viewGroup = new QButtonGroup(viewToolBar);
|
auto* viewHeader = seg.header;
|
||||||
viewGroup->setExclusive(true);
|
auto* act2D = seg.buttons[0];
|
||||||
auto* act2D = new QToolButton(viewToolBar);
|
auto* act3D = seg.buttons[1];
|
||||||
act2D->setText(QStringLiteral("二维地图"));
|
centerLayout->addWidget(viewHeader);
|
||||||
act2D->setCheckable(true);
|
|
||||||
auto* act3D = new QToolButton(viewToolBar);
|
|
||||||
act3D->setText(QStringLiteral("三维视图"));
|
|
||||||
act3D->setCheckable(true);
|
|
||||||
viewGroup->addButton(act2D);
|
|
||||||
viewGroup->addButton(act3D);
|
|
||||||
viewBarLay->addWidget(act2D);
|
|
||||||
viewBarLay->addWidget(act3D);
|
|
||||||
viewBarLay->addStretch();
|
|
||||||
act2D->setChecked(true); // 默认二维地图
|
|
||||||
geopro::app::applyThemedStyleSheet(viewToolBar, kBarBtnQss);
|
|
||||||
centerLayout->addWidget(viewToolBar);
|
|
||||||
centerLayout->addWidget(vtkWidget, 1);
|
centerLayout->addWidget(vtkWidget, 1);
|
||||||
|
|
||||||
// ──「视图详情」图层浮层(对齐原型 3D 视图左上):浮在 QVTK 之上,控制三维图层显隐。
|
// ──「视图详情」图层浮层(对齐原型 3D 视图左上):浮在 QVTK 之上,控制三维图层显隐。
|
||||||
|
|
@ -420,13 +408,15 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
|
||||||
|
|
||||||
auto* esIcon = new QLabel(emptyState);
|
auto* esIcon = new QLabel(emptyState);
|
||||||
esIcon->setPixmap(
|
esIcon->setPixmap(
|
||||||
geopro::app::makeGlyph(geopro::app::Glyph::Dataset, QColor("#C2CCDA"), 56).pixmap(56, 56));
|
geopro::app::makeGlyph(geopro::app::Glyph::Dataset,
|
||||||
|
geopro::app::tokenColor("canvas/text-dim"), 56)
|
||||||
|
.pixmap(56, 56));
|
||||||
esIcon->setAlignment(Qt::AlignCenter);
|
esIcon->setAlignment(Qt::AlignCenter);
|
||||||
|
|
||||||
auto* esTitle = new QLabel(QStringLiteral("选择左侧数据集开始分析"), emptyState);
|
auto* esTitle = new QLabel(QStringLiteral("选择左侧数据集开始分析"), emptyState);
|
||||||
esTitle->setAlignment(Qt::AlignCenter);
|
esTitle->setAlignment(Qt::AlignCenter);
|
||||||
geopro::app::applyThemedStyleSheet(
|
geopro::app::applyTokenizedStyleSheet(
|
||||||
esTitle, QStringLiteral("color:#5A6B85; font-size:%1px; font-weight:%2;")
|
esTitle, QStringLiteral("color:{{canvas/text}}; font-size:%1px; font-weight:%2;")
|
||||||
.arg(geopro::app::scaledPx(geopro::app::type::kHeading))
|
.arg(geopro::app::scaledPx(geopro::app::type::kHeading))
|
||||||
.arg(geopro::app::type::kWeightSemibold));
|
.arg(geopro::app::type::kWeightSemibold));
|
||||||
|
|
||||||
|
|
@ -434,9 +424,9 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
|
||||||
"切到「三维视图」可叠加帘面、体素与地形图层"),
|
"切到「三维视图」可叠加帘面、体素与地形图层"),
|
||||||
emptyState);
|
emptyState);
|
||||||
esHint->setAlignment(Qt::AlignCenter);
|
esHint->setAlignment(Qt::AlignCenter);
|
||||||
geopro::app::applyThemedStyleSheet(
|
geopro::app::applyTokenizedStyleSheet(
|
||||||
esHint,
|
esHint,
|
||||||
QStringLiteral("color:#8A93A3; font-size:%1px;").arg(geopro::app::scaledPx(geopro::app::type::kBody)));
|
QStringLiteral("color:{{canvas/text-dim}}; font-size:%1px;").arg(geopro::app::scaledPx(geopro::app::type::kBody)));
|
||||||
|
|
||||||
esLay->addWidget(esIcon);
|
esLay->addWidget(esIcon);
|
||||||
esLay->addWidget(esTitle);
|
esLay->addWidget(esTitle);
|
||||||
|
|
@ -827,9 +817,9 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
|
||||||
});
|
});
|
||||||
|
|
||||||
// 「视图详情」浮层显隐:仅三维显示,置于 QVTK 左上(工具条下方)并置顶。
|
// 「视图详情」浮层显隐:仅三维显示,置于 QVTK 左上(工具条下方)并置顶。
|
||||||
auto showLayerPanel = [layerPanel, viewToolBar](bool show3D) {
|
auto showLayerPanel = [layerPanel, viewHeader](bool show3D) {
|
||||||
if (show3D) {
|
if (show3D) {
|
||||||
layerPanel->move(14, viewToolBar->height() + 12);
|
layerPanel->move(14, viewHeader->height() + 12);
|
||||||
layerPanel->adjustSize();
|
layerPanel->adjustSize();
|
||||||
layerPanel->setVisible(true);
|
layerPanel->setVisible(true);
|
||||||
layerPanel->raise();
|
layerPanel->raise();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue