Qt:为什么随着操作系统扩展规模的增加,DPI会降低

时间:2019-04-09 08:54:43

标签: qt dpi

我有一个Qt应用程序,并且随着操作系统在显示设置中缩放比例的变化,我需要对应用程序进行调整(放大/缩小)。

我从互联网上读到以下内容:

  

标准DPI设置为100%(96 DPI),125%(120 DPI)和150%   (144 DPI)

但是,从Qt应用程序登录时,我的DPI值低于以下值:

比例-物理DPI X-物理DPI Y

100%-158,159

125%-158,159

150%-79,79

175%-79,79

因此,根据上述值,应用程序文本大小对于100%和125%的比例没有差异。相同的行为适用于150%和175%。

下面是我使用的Qt代码:

--exclude file1[,fileN] (--exclude can be replaced with -e as well)

有人可以指导吗?我想要实现的是Qt应用程序的行为(更改应用程序大小/字体大小)取决于在 OS Display Settings 中设置的缩放比例。

1 个答案:

答案 0 :(得分:2)

我最初建议在此答案中使用QWindow::devicePixelRatio()。但是,从Qt 5.12开始,这实际上还不能正常工作。 Qt将避免由于bug in Qt's UI scaling implementation而导致的分数缩放比例。因此对于125%,它仍将返回1.0缩放因子。达到175%时,它将返回2.0,而不是1.75。

因此,现在,您应该回到查询DPI。但是,请像现在一样查询逻辑 DPI,而不是物理DPI。将对physicalDpi()个函数的调用替换为对logicalDpi()个函数的调用。这应该为您提供Microsoft Windows报告的标准96/120/144 DPI。

一旦Qt修复了错误,下面的答案的上一部分就可以使用。


上一个答案,仅在Qt修复其缩放错误后适用

直接查询缩放比例,不要尝试从DPI推断出来。为此,请使用QWindow::devicePixelRatio()。在100%缩放时,将返回1.0。在缩放比例为125%时,它将返回1.25。等等。由于这是比例因子,因此您可以将其用作尺寸的乘数。

您应该在小部件当前所在的窗口中调用devicePixelRatio()。这是因为不同的窗口可以在多显示器设置的不同显示器上显示。

可以使用QWidget::windowHandle()获取窗口小部件所在的窗口。如果小部件不是窗口,则可以返回null。因此,您可能应该编写一个小的辅助函数,为小部件返回正确的DPR(设备像素比率)。它应该以QWidget作为参数,并且如果windowHandle()为该窗口小部件返回null,则沿父级树前进,在每个父级上调用windowHandle(),直到找到第一个不返回null的父级。然后返回windowHandle()->devicePixelRatio()。这将是在该小部件中使用的正确DPR。