feat/vtk-merged-dataset-column #10
|
|
@ -12,6 +12,7 @@
|
|||
#include <QPushButton>
|
||||
#include <QSet>
|
||||
#include <QSignalBlocker>
|
||||
#include <QSizePolicy>
|
||||
#include <QSlider>
|
||||
#include <QTimer>
|
||||
#include <QToolButton>
|
||||
|
|
@ -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)。
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
#include <QMenu>
|
||||
#include <QResizeEvent>
|
||||
#include <QSize>
|
||||
#include <QSizePolicy>
|
||||
#include <QToolButton>
|
||||
#include <algorithm>
|
||||
|
||||
|
|
@ -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<int>(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<IconAction>& a) {
|
||||
|
|
@ -101,6 +116,7 @@ void SectionIconBar::setActions(const std::vector<IconAction>& a) {
|
|||
overflowBtn_->setMenu(new QMenu(overflowBtn_));
|
||||
if (lay) lay->addWidget(overflowBtn_);
|
||||
|
||||
updateGeometry(); // 操作数变化 → 通知父布局重新按新 sizeHint 分配宽度
|
||||
relayout();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#pragma once
|
||||
#include <QWidget>
|
||||
#include <QSize>
|
||||
#include <QString>
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
|
|
@ -25,7 +26,12 @@ class SectionIconBar : public QWidget {
|
|||
public:
|
||||
explicit SectionIconBar(QWidget* parent = nullptr);
|
||||
void setActions(const std::vector<IconAction>& 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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue