From 575529e5a00e87e1fc108422f7c4c0a96a591181 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Tue, 16 Jun 2026 17:34:32 +0800 Subject: [PATCH] =?UTF-8?q?fix(vtk):=20=E6=95=B0=E6=8D=AE=E9=9B=86?= =?UTF-8?q?=E5=8D=A1=E7=89=87=E4=BB=A3=E7=90=86=E6=94=AF=E6=8C=81=E5=A4=8D?= =?UTF-8?q?=E9=80=89=E6=A1=86(=E5=8F=AF=E5=8B=BE=E9=80=89=E9=A1=B9?= =?UTF-8?q?=E7=94=BB=E6=A1=86+=E7=82=B9=E5=87=BB=E5=88=87=E6=8D=A2)+?= =?UTF-8?q?=E6=8A=98=E5=8F=A0=E6=8C=89=E9=92=AE=E5=8A=A0=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/panels/DatasetListPanel.cpp | 51 ++++++++++++++++++++++++- src/app/panels/columns/ColumnDrawer.cpp | 17 ++++++--- 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/src/app/panels/DatasetListPanel.cpp b/src/app/panels/DatasetListPanel.cpp index 1e418f5..1e44022 100644 --- a/src/app/panels/DatasetListPanel.cpp +++ b/src/app/panels/DatasetListPanel.cpp @@ -1,14 +1,18 @@ #include "panels/DatasetListPanel.hpp" #include +#include #include #include +#include #include #include +#include #include #include #include #include +#include #include #include #include @@ -77,6 +81,23 @@ public: geopro::app::tokenColor("accent/primary")); } + // 可勾选项:左侧画复选框(用当前 style 的指示器),文本整体右移。 + int textLeftPad = 14; + const bool checkable = (idx.flags() & Qt::ItemIsUserCheckable); + if (checkable) { + const int box = 16; + QRect checkRect(r.left() + 12, r.top() + (r.height() - box) / 2, box, box); + const auto cs = static_cast(idx.data(Qt::CheckStateRole).toInt()); + QStyleOptionViewItem o(opt); + o.rect = checkRect; + o.state &= ~QStyle::State_HasFocus; + o.state |= (cs == Qt::Checked ? QStyle::State_On : QStyle::State_Off); + const QWidget* w = opt.widget; + QStyle* st = w ? w->style() : QApplication::style(); + st->drawPrimitive(QStyle::PE_IndicatorItemViewItemCheck, &o, p, w); + textLeftPad = 12 + box + 8; // 复选框右侧留白后再放文本 + } + QString title = disp, meta; const int nl = disp.indexOf(QLatin1Char('\n')); if (nl >= 0) { @@ -84,7 +105,7 @@ public: meta = disp.mid(nl + 1); } - const QRect textR = r.adjusted(14, 6, -12, -6); + const QRect textR = r.adjusted(textLeftPad, 6, -12, -6); // 标题 QFont tf = opt.font; tf.setPixelSize(geopro::app::scaledPx(13)); @@ -106,6 +127,34 @@ public: } p->restore(); } + + bool editorEvent(QEvent* ev, QAbstractItemModel* model, const QStyleOptionViewItem& opt, + const QModelIndex& idx) override { + if (!(idx.flags() & Qt::ItemIsUserCheckable)) + return QStyledItemDelegate::editorEvent(ev, model, opt, idx); + const QRect r = opt.rect.adjusted(4, 2, -4, -2); + const int box = 16; + // 命中区放宽到复选框左侧整段(含一点文本起始),便于点击。 + const QRect hit(r.left(), r.top(), 12 + box + 8, r.height()); + auto toggle = [&]() { + const auto cur = static_cast(idx.data(Qt::CheckStateRole).toInt()); + model->setData(idx, cur == Qt::Checked ? Qt::Unchecked : Qt::Checked, Qt::CheckStateRole); + }; + if (ev->type() == QEvent::MouseButtonRelease) { + auto* me = static_cast(ev); + if (me->button() == Qt::LeftButton && hit.contains(me->pos())) { + toggle(); + return true; + } + } else if (ev->type() == QEvent::KeyPress) { + auto* ke = static_cast(ev); + if (ke->key() == Qt::Key_Space || ke->key() == Qt::Key_Select) { + toggle(); + return true; + } + } + return QStyledItemDelegate::editorEvent(ev, model, opt, idx); + } }; } // namespace diff --git a/src/app/panels/columns/ColumnDrawer.cpp b/src/app/panels/columns/ColumnDrawer.cpp index 0479003..4d853cb 100644 --- a/src/app/panels/columns/ColumnDrawer.cpp +++ b/src/app/panels/columns/ColumnDrawer.cpp @@ -2,6 +2,7 @@ #include "panels/columns/Column3DDataset.hpp" #include "panels/columns/Column2DDataset.hpp" #include "panels/columns/Column3DAnalysis.hpp" +#include "Theme.hpp" #include #include #include @@ -23,10 +24,16 @@ ColumnDrawer::ColumnDrawer(QWidget* parent) tabs->addTab(col2D_, QStringLiteral("二维数据集")); tabs->addTab(colAnalysis_, QStringLiteral("三维分析")); - // 折叠按钮:固定宽 16px,垂直拉伸 + // 折叠按钮:固定宽 18px,垂直拉伸 toggleBtn_ = new QPushButton(QStringLiteral("◀"), this); - toggleBtn_->setFixedWidth(16); + toggleBtn_->setFixedWidth(18); toggleBtn_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); + toggleBtn_->setCursor(Qt::PointingHandCursor); + toggleBtn_->setToolTip(QStringLiteral("折叠 / 展开")); + geopro::app::applyTokenizedStyleSheet(toggleBtn_, + QStringLiteral("QPushButton{background:{{bg/panel-subtle}};color:{{text/secondary}};" + "border:none;border-left:1px solid {{border/default}};font-size:12px;}" + "QPushButton:hover{background:{{bg/hover}};color:{{accent/primary}};}")); connect(toggleBtn_, &QPushButton::clicked, this, &ColumnDrawer::toggleCollapsed); // 根布局:[body_ | toggleBtn_],无边距 @@ -36,8 +43,8 @@ ColumnDrawer::ColumnDrawer(QWidget* parent) root->addWidget(body_, 1); root->addWidget(toggleBtn_, 0); - // 展开时限宽 ~316px (300 body + 16 btn) - setMaximumWidth(316); + // 展开时限宽 ~318px (300 body + 18 btn) + setMaximumWidth(318); } void ColumnDrawer::toggleCollapsed() @@ -46,7 +53,7 @@ void ColumnDrawer::toggleCollapsed() body_->setVisible(!collapsed_); toggleBtn_->setText(collapsed_ ? QStringLiteral("▶") : QStringLiteral("◀")); // 折叠后只保留按钮宽度;展开恢复上限 - setMaximumWidth(collapsed_ ? 16 : 316); + setMaximumWidth(collapsed_ ? 18 : 318); } } // namespace geopro::app