【问题标题】:Can QFontMetrics account for windows dpi scaling?QFontMetrics 可以考虑 Windows dpi 缩放吗?
【发布时间】:2018-04-19 01:11:52
【问题描述】:

我的印象是,如果您在应用程序中这样做

QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication* app = new QApplication(temp, NULL);

然后字体会在高分辨率显示器上自动放大。如果您在 Windows 10 中显式增加字体缩放(设置-->系统->自定义缩放),则相同。

但是,在 Windows 10 中以 100% 和 200% 缩放运行以下代码时,它不会返回两倍大小。

QFont font = QFont("arial", 10);
QFontMetrics fm(font);
int width = fm.width("abcdefgABCDEFG");

奇怪的是只有1个像素的差异。

100% --> width = 108 pixels
200% --> width = 109 pixels

这是为什么呢?我可以让 QFontMetrics 考虑 Windows 缩放吗?还是我需要使用逻辑/物理 DPI 来推断字体大小必须增加 2 倍?

谢谢

【问题讨论】:

  • 这只是您的 Qt 应用程序预先运行的模式:stackoverflow.com/questions/39823918/…
  • 对@AlexanderVX,我应该提到我启用了自动 HighDPI 缩放
  • 那么问题是“为什么会这样?我需要自己计算文本的缩放大小吗?”回答?不,操作系统正在处理适当的缩放。那就别打扰了。您还有其他问题吗?
  • 它确实放大了 Qt 绘制的所有内容(标签、组合框、表格视图......)。但我的应用程序还包括一个 OpenGL 小部件,我们在其中绘制标签。我们使用 QPainter 在图像中绘制文本。虽然当我增加缩放比例时整个应用程序字体似乎加倍,但使用 QPainter 生成的那些标签却没有。
  • 检查QScreen::physicalDotsPerInch 是否与实际分辨率成比例变化。我现在在没有适当的高 Dpi 支持的 Linux 系统上,但这应该可以工作。这可能取决于 Qt 平台的实现。

标签: qt scaling dpi qfontmetrics qfont


【解决方案1】:

为了自定义绘制项目的正确缩放,使用QScreen::physicalDotPerInch属性来实现缩放系数以应用于实际绘图:

qreal myScale = pScreen->physicalDotPerInch() / constStandardPerInch;

附:这个问题还需要修改。

【讨论】:

  • 你给出的答案是错误的。 physicalDotsPerInch() 是常量,取决于视频驱动程序报告的显示器大小。它为了找到您需要使用logicalDotsPerInch() 除以96 DPI 的比例因子。 96 DPI 被选为 100% 比例是出于历史原因(我猜是微软),而今天与真正的 DPI 无关。从 Qt5.4 开始,有一个选项可以通知 Windows 管理器您的应用程序了解显示缩放。今天它是默认值,字体已正确缩放。在 5.9 QFontMetrics::width 返回正确的像素值。
  • QT article, MSDN article 我不想去编辑你的答案,为了正确请自己做。
  • 说系统正在缩放字体也很模糊——它是字体渲染器的工作,它不需要是系统一。为了完整性 72.272 点 = 254 mm = 1'。我无法计算出用于在屏幕上呈现字体的 DPI 比例,但可以肯定的是使用 logicalDPI 作为等式的一部分。
猜你喜欢
  • 2012-02-22
  • 2014-11-22
  • 2018-02-21
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 2018-04-11
  • 2021-08-26
  • 2013-10-19
相关资源
最近更新 更多