我有一个Qt应用程序,我需要调整应用程序(放大/缩小),因为缩放更改来自显示设置中的操作系统。
我从互联网上读到:
标准DPI设置为100%(96 DPI),125%(120 DPI)和150%(144 DPI)
但是,从Qt应用程序登录时,我的DPI值低于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应用程序的行为(更改应用程序大小/字体大小)取决于在操作系统的显示设置中设置的缩放。
我最初建议在这个答案中使用QWindow::devicePixelRatio()
。但是,从Qt 5.12开始,这实际上并没有正常工作。由于bug in Qt's UI scaling implementation,Qt将避免分数缩放比率。因此,对于125%,它仍将返回1.0比例因子。在175%时,它将返回2.0而不是1.75。
所以现在,你应该回到查询DPI。但是,查询逻辑DPI,而不是现在正在执行的物理DPI。通过调用physicalDpi()
函数替换对logicalDpi()
函数的调用。这应该为您提供Microsoft Windows报告的标准96/120/144 DPI。
一旦Qt修复了bug,下面的答案的前一部分就可以使用了。
直接查询缩放比例,不要尝试从DPI推断它。你使用QWindow::devicePixelRatio()
。在100%缩放时,这将返回1.0。在125%缩放时,它将返回1.25。等等。由于这是缩放系数,因此您可以将其用作尺寸的乘数。
你应该在你的小部件当前所在的窗口上调用devicePixelRatio()
。这是因为不同的窗口可以在多显示器设置的不同显示器上。
可以使用QWidget::windowHandle()
获取窗口小部件所在的窗口。如果窗口小部件不是窗口,则可以返回null。因此,您应该编写一个小辅助函数,为小部件返回正确的DPR(设备像素比)。它应该将QWidget作为参数,如果windowHandle()
为窗口小部件返回null,则向上走父树,在每个父窗口上调用windowHandle()
,直到找到第一个不返回null的父窗口。然后返回windowHandle()->devicePixelRatio()
。这将是在该窗口小部件中使用的正确DPR。