From 6c34f71177e7cd5bd62cd1d932cb0acfc6309519 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Wed, 10 Jun 2026 14:58:01 +0800 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=E4=B8=8B=E6=8B=89=E6=A1=86=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=E6=94=B9=E4=B8=BA=E7=B4=A7=E8=B4=B4=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E6=A1=86=E4=B8=8B=E6=96=B9=E7=9A=84=E5=8D=95=E5=B1=82=E5=88=97?= =?UTF-8?q?=E8=A1=A8(AppProxyStyle)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: Fusion 的 combo 弹窗是「菜单式覆盖当前项」(SH_ComboBox_Popup=true) → 位置怪、 容器框+列表两层、选中/悬停不清。AppProxyStyle 把该 hint 改为 0 → 标准「下方下拉列表」: 位置紧贴文本框、单层、当前项与悬停项走 ::item:selected 高亮。 --- src/app/Theme.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/app/Theme.cpp b/src/app/Theme.cpp index 6c8a941..e05e7eb 100644 --- a/src/app/Theme.cpp +++ b/src/app/Theme.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -14,6 +15,19 @@ namespace geopro::app { namespace { +// 应用样式:在 Fusion 基础上把下拉框弹窗改为「列表紧贴文本框下方」(而非 Fusion 默认的 +// 菜单式弹窗覆盖当前项——那会导致弹窗位置怪、容器+列表两层、选中不清)。 +class AppProxyStyle : public QProxyStyle { +public: + AppProxyStyle() : QProxyStyle(QStyleFactory::create(QStringLiteral("Fusion"))) {} + int styleHint(StyleHint hint, const QStyleOption* opt, const QWidget* w, + QStyleHintReturn* ret) const override + { + if (hint == QStyle::SH_ComboBox_Popup) return 0; + return QProxyStyle::styleHint(hint, opt, w, ret); + } +}; + // 全局样式表(浅色专业)。只描述外观,不含任何交互逻辑。 // 注意:刻意不重写 QCheckBox::indicator —— Fusion 一旦检测到 indicator 子控件被改写, // 就需要自带勾选 image,否则勾选态会变成空白方块。这里交给 Fusion 原生绘制, @@ -479,8 +493,8 @@ QPalette buildPalette(bool dark) void applyThemeMode(QApplication& app, bool dark) { - // Fusion:跨平台一致且对 QSS 友好(Windows 原生风对部分控件会忽略样式表)。 - app.setStyle(QStyleFactory::create(QStringLiteral("Fusion"))); + // Fusion + 下拉框弹窗修正(AppProxyStyle):跨平台一致、对 QSS 友好。 + app.setStyle(new AppProxyStyle()); // 基础字体:微软雅黑 UI;基准字号取令牌 type::kBody(13px),与 QSS 同单位。 QFont base(QStringLiteral("Microsoft YaHei UI"));