feat/vtk-3d-view #7

Merged
gaozheng merged 301 commits from feat/vtk-3d-view into main 2026-06-27 18:43:52 +08:00
3 changed files with 25 additions and 4 deletions
Showing only changes of commit 6a371c9fa9 - Show all commits

View File

@ -49,9 +49,10 @@ CategoryAnalysisTab::CategoryAnalysisTab(geopro::data::DatasetFieldDictionary* d
&CategoryAnalysisTab::sliceExportDatRequested);
connect(sec, &CategorySection::anomalyVisibilityChanged, this,
&CategoryAnalysisTab::anomalyVisibilityChanged);
col->addWidget(sec);
// #7各段等分 stretch → 内容都少时四段平分高度填满面板(初始与 VTK 区等高、不出滚动条)
// 某段内容增多时其最小高度(=内容总高)撑大,超出视口则由外层 QScrollArea 统一出纵向滚动条。
col->addWidget(sec, 1);
}
col->addStretch(1);
scroll->setWidget(content);
}

View File

@ -82,6 +82,9 @@ CategorySection::CategorySection(const CategorySpec& spec, geopro::data::Dataset
list_->setHeaderHidden(true);
list_->setRootIsDecorated(true);
list_->setIndentation(14); // 紧凑父子缩进(默认 20 太宽)
// #7段体不出内层滚动条——内容超出时整段拉长由 CategoryAnalysisTab 外层 QScrollArea 统一滚动。
list_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
list_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
applyDatasetCardDelegate(list_);
connect(list_, &QTreeWidget::itemChanged, this, [this](QTreeWidgetItem*, int) { emitChecked(); });
connect(list_, &QTreeWidget::itemDoubleClicked, this, [this](QTreeWidgetItem* it, int) {
@ -220,6 +223,13 @@ void CategorySection::rebuildList() {
}
}
list_->expandAll(); // 展开容器层级(项目根/GS/TM让体/切片/异常可见
// #7段体无内层滚动条 → list 最小高度 = 可见项内容总高(与 DatasetCardDelegate::sizeHint 一致:
// 有副标题 52否则 30。内容多则撑大本段、超视口由外层滚动内容少则被 stretch 拉到平分高度。
int contentH = 2 * list_->frameWidth() + 4;
for (QTreeWidgetItemIterator hit(list_); *hit; ++hit)
if (!(*hit)->isHidden())
contentH += (*hit)->text(0).contains(QLatin1Char('\n')) ? 52 : 30;
list_->setMinimumHeight(contentH);
emitChecked(); // 重建后必为空选,清掉上次渲染勾选
}

View File

@ -21,6 +21,16 @@ DateRangeEdit::DateRangeEdit(QWidget* parent) : QWidget(parent) {
btn_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
btn_->setPopupMode(QToolButton::InstantPopup);
btn_->setToolTip(QStringLiteral("按采集时间筛选(起 ~ 止),可清空"));
// 外观与 QComboBox 完全一致(同高/同边框/同圆角/同内距)+ 右侧统一 SVG chevron替代手写 ▾,
// 原 ▾ 字符渲染粗糙且按钮比装置下拉矮)。右侧留 24px 放 chevron文本左对齐。
applyTokenizedStyleSheet(
btn_, QStringLiteral(
"QToolButton{background-color:{{bg/panel}};color:{{text/primary}};"
"border:1px solid {{border/default}};border-radius:4px;"
"padding:6px 24px 6px 8px;min-height:16px;text-align:left;"
"background-image:url(:/icons/chevron-down.svg);background-repeat:no-repeat;"
"background-position:right 8px center;}"
"QToolButton:hover{border-color:{{border/strong}};}"));
connect(btn_, &QToolButton::clicked, this, &DateRangeEdit::openPopup);
lay->addWidget(btn_);
updateText();
@ -86,12 +96,12 @@ void DateRangeEdit::clearAndClose() {
void DateRangeEdit::updateText() {
if (!from_.isValid() && !to_.isValid()) {
btn_->setText(QStringLiteral("全部时间"));
btn_->setText(QStringLiteral("全部时间")); // chevron 由 QSS background-image 绘制
return;
}
const QString f = from_.isValid() ? from_.toString(QStringLiteral("yyyy-MM-dd")) : QStringLiteral("不限");
const QString t = to_.isValid() ? to_.toString(QStringLiteral("yyyy-MM-dd")) : QStringLiteral("不限");
btn_->setText(QStringLiteral("%1 ~ %2").arg(f, t));
btn_->setText(QStringLiteral("%1 ~ %2").arg(f, t));
}
} // namespace geopro::app