Windows不同DPI场景下QMenu字号设置逻辑及实现位置查询
Qt菜单DPI适配字号计算逻辑说明
源码位置
Qt菜单字号的非线性适配逻辑分散在三个核心文件中:
- Windows平台字体度量实现:
qtbase/src/gui/text/qfont_win.cpp中的QFontEngineWin::getTrueTypeFontMetrics函数,会对缩放后的字号做阶梯舍入,避免非整数或过小字号出现渲染模糊问题。 - QMenu内部布局逻辑:
qtbase/src/widgets/widgets/qmenu.cpp的QMenuPrivate::calculateActionRects方法,会优先读取系统风格定义的菜单标准字体,而非直接使用全局字体做线性缩放。 - Windows平台风格实现:
qtbase/src/plugins/styles/windows/qwindowsstyle.cpp的QWindowsStyle::pixelMetric方法,查询菜单相关度量值的同时,会根据当前DPI返回预定义的阶梯字号值,你遇到的125%、150%缩放都对应9pt就是该方法的预设规则。
适配方案
不需要自己复刻计算逻辑,直接调用Qt公开接口即可获取和原生菜单完全一致的适配后字体:
// 直接获取Qt原生适配DPI后的菜单标准字体 QFont standardMenuFont = QApplication::font("QMenu"); // 给自定义QWidgetAction承载的控件设置该字体即可 customActionWidget->setFont(standardMenuFont);
如果需要手动实现对齐逻辑,可参考Qt的计算规则:
- 基准值为96DPI(100%缩放)下的8pt字号
- 计算线性缩放后的字号后,向下取整到Qt预设的标准字号阶梯(8、9、10、12、14...),未达到下一级字号阈值时沿用当前级字号。
内容的提问来源于stack exchange,提问作者Kapitan
相关产品推荐
相关产品推荐

