From e9a9866c347e3a4f54fd88461051fea0819048c0 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Wed, 1 Jul 2026 07:43:49 +0800 Subject: [PATCH] =?UTF-8?q?fix(vtk):=20=E6=AE=B5=E5=A4=B4=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E6=9D=A1=E5=AE=9E=E7=8E=B0sizeHint,=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E8=A2=AB=E6=A0=87=E9=A2=98=E6=8C=A4=E5=8E=8B=E8=87=B4=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E6=8A=98=E5=8F=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SectionIconBar 未实现 sizeHint/minimumSizeHint:段头 HBox(标题|stretch|图标条) 在 width()=0 构造期 relayout 折叠全部图标→内层布局尺寸塌缩成只剩「…」→恒折叠。 现实现 sizeHint(默认上限内全图标宽 count*iconPx)与 minimumSizeHint(仅「…」), 水平 Preferred/垂直 Fixed;标题改 Preferred+最小宽 0 先让位,使图标条守住宽度 直到列真正变窄才将右侧图标折进「…」。不改 visibleIconCount 逻辑与单测。 --- src/app/panels/columns/CategorySection.cpp | 5 +++++ src/app/panels/columns/SectionIconBar.cpp | 16 ++++++++++++++++ src/app/panels/columns/SectionIconBar.hpp | 8 +++++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/app/panels/columns/CategorySection.cpp b/src/app/panels/columns/CategorySection.cpp index e8d8e69..03f172d 100644 --- a/src/app/panels/columns/CategorySection.cpp +++ b/src/app/panels/columns/CategorySection.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -70,6 +71,10 @@ CategorySection::CategorySection(const geopro::data::CategoryDescriptor& desc, + QString::fromStdString(desc_.title)); }; syncHeader(); + // 标题先让位:水平 Preferred + 最小宽 0,列变窄时标题先收(必要时裁字),图标条守住自身 + // sizeHint(全图标宽)直到真正没空间才折叠右侧图标进「…」。否则标题不肯缩→图标条被迫先折(过早)。 + header_->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + header_->setMinimumWidth(0); hl->addWidget(header_); hl->addStretch(1); // 段头图标条:遍历 desc_.operations,经一处 OpKind→IconAction 映射装配(spec §6)。 diff --git a/src/app/panels/columns/SectionIconBar.cpp b/src/app/panels/columns/SectionIconBar.cpp index 9a03dda..55cae40 100644 --- a/src/app/panels/columns/SectionIconBar.cpp +++ b/src/app/panels/columns/SectionIconBar.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -55,6 +56,20 @@ SectionIconBar::SectionIconBar(QWidget* parent) : QWidget(parent) { auto* lay = new QHBoxLayout(this); lay->setContentsMargins(0, 0, 0, 0); lay->setSpacing(0); + // 水平 Preferred:优先取 sizeHint(全图标宽),列变窄受压时可缩向 minimumSizeHint(仅「…」); + // 垂直 Fixed:高度恒为图标按钮高。不可用 Fixed-Fixed(永不折叠)或 Ignored(丢 sizeHint)。 + setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); +} + +QSize SectionIconBar::sizeHint() const { + // 默认上限内的图标全显所需宽度:min(操作数, maxIcons_) 个按钮,各占 iconPx_。 + const int count = std::min(static_cast(actions_.size()), std::max(0, maxIcons_)); + return QSize(count * iconPx_, iconPx_); +} + +QSize SectionIconBar::minimumSizeHint() const { + // 最窄也要放下「…」溢出按钮,使本条可缩到仅剩「…」。 + return QSize(overflowPx_, iconPx_); } void SectionIconBar::setActions(const std::vector& a) { @@ -101,6 +116,7 @@ void SectionIconBar::setActions(const std::vector& a) { overflowBtn_->setMenu(new QMenu(overflowBtn_)); if (lay) lay->addWidget(overflowBtn_); + updateGeometry(); // 操作数变化 → 通知父布局重新按新 sizeHint 分配宽度 relayout(); } diff --git a/src/app/panels/columns/SectionIconBar.hpp b/src/app/panels/columns/SectionIconBar.hpp index 706a1bd..4033ff8 100644 --- a/src/app/panels/columns/SectionIconBar.hpp +++ b/src/app/panels/columns/SectionIconBar.hpp @@ -1,5 +1,6 @@ #pragma once #include +#include #include #include #include @@ -25,7 +26,12 @@ class SectionIconBar : public QWidget { public: explicit SectionIconBar(QWidget* parent = nullptr); void setActions(const std::vector& actions); // 重建按钮 - void setMaxIcons(int n) { maxIcons_ = n; relayout(); } + void setMaxIcons(int n) { maxIcons_ = n; updateGeometry(); relayout(); } + // sizeHint:声明放下「默认上限内全部图标」所需宽度,使段头 HBox 分给本条真实宽度 + // (否则 relayout 在 width()=0 时折叠全部图标→内层布局尺寸塌缩成只剩「…」→恒折叠,见 spec §6)。 + QSize sizeHint() const override; + // minimumSizeHint:至少容下「…」溢出按钮,列足够窄时本条可缩到仅剩「…」。 + QSize minimumSizeHint() const override; protected: void resizeEvent(QResizeEvent* e) override; private: