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 Settings 的 OS.
我最初建议在此答案中使用 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。
我有一个 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 Settings 的 OS.
我最初建议在此答案中使用 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.
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。