fix(ui): 下拉框弹窗改为紧贴文本框下方的单层列表(AppProxyStyle)

根因: Fusion 的 combo 弹窗是「菜单式覆盖当前项」(SH_ComboBox_Popup=true) → 位置怪、
容器框+列表两层、选中/悬停不清。AppProxyStyle 把该 hint 改为 0 → 标准「下方下拉列表」:
位置紧贴文本框、单层、当前项与悬停项走 ::item:selected 高亮。
This commit is contained in:
gaozheng 2026-06-10 14:58:01 +08:00
parent a6a3979b93
commit 6c34f71177
1 changed files with 16 additions and 2 deletions

View File

@ -5,6 +5,7 @@
#include <QFont> #include <QFont>
#include <QObject> #include <QObject>
#include <QPalette> #include <QPalette>
#include <QProxyStyle>
#include <QSettings> #include <QSettings>
#include <QStyleFactory> #include <QStyleFactory>
#include <QStyleHints> #include <QStyleHints>
@ -14,6 +15,19 @@ namespace geopro::app {
namespace { 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 子控件被改写, // 注意:刻意不重写 QCheckBox::indicator —— Fusion 一旦检测到 indicator 子控件被改写,
// 就需要自带勾选 image否则勾选态会变成空白方块。这里交给 Fusion 原生绘制, // 就需要自带勾选 image否则勾选态会变成空白方块。这里交给 Fusion 原生绘制,
@ -479,8 +493,8 @@ QPalette buildPalette(bool dark)
void applyThemeMode(QApplication& app, bool dark) void applyThemeMode(QApplication& app, bool dark)
{ {
// Fusion:跨平台一致且对 QSS 友好Windows 原生风对部分控件会忽略样式表) // Fusion + 下拉框弹窗修正AppProxyStyle跨平台一致、对 QSS 友好
app.setStyle(QStyleFactory::create(QStringLiteral("Fusion"))); app.setStyle(new AppProxyStyle());
// 基础字体:微软雅黑 UI基准字号取令牌 type::kBody(13px),与 QSS 同单位。 // 基础字体:微软雅黑 UI基准字号取令牌 type::kBody(13px),与 QSS 同单位。
QFont base(QStringLiteral("Microsoft YaHei UI")); QFont base(QStringLiteral("Microsoft YaHei UI"));