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"));