Qt:为什么 DPI 会随着 OS 的缩放比例的增加而降低

Qt: Why DPI decrease on increasing Scaling from OS

我有一个 Qt 应用程序,我需要调整应用程序 (zoom-in/zoom-out),因为 显示设置 中的 OS 的缩放比例发生了变化。

我从网上看到:

The standard DPI settings are 100% (96 DPI), 125% (120 DPI), and 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代码:

    #include <QWidget>
    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QWidget  widget;
    qInfo() << "Hello Qt";
    int dpiX = widget.physicalDpiX();
    int dpiY = widget.physicalDpiY();
    qInfo() << dpiX;
    qInfo() << dpiY;

谁能指导一下?我想要实现的是 Qt 应用程序的行为(更改应用程序大小/字体大小)取决于 Display SettingsOS.

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

所以现在,您应该回过头来查询 DPI。然而,查询逻辑 DPI,不是你现在做的物理DPI。将对 physicalDpi() 函数的调用替换为对 logicalDpi() 函数的调用。这应该为您提供 Microsoft Windows.

报告的标准 96/120/144 DPI

Qt 修复 bug 后,可以使用下面答案的前一部分。


上一个答案,一旦 Qt 修复了它们的缩放错误就适用

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

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

小部件所在的window可以通过QWidget::windowHandle()获得。如果小部件不是 window,这可以 return 为 null。因此,您可能应该编写一个小的辅助函数,return 为小部件提供正确的 DPR(设备像素比)。它应该将 QWidget 作为参数,如果 windowHandle() return 小部件为空,则沿着父树向上走,在每个父树上调用 windowHandle() 直到找到第一个不存在的树t return 空。然后returnwindowHandle()->devicePixelRatio()。这将是在该小部件中使用的正确 DPR。