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: