Qt:为什么DPI会因操作系统的扩展而降低

问题描述 投票:1回答:1

我有一个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应用程序的行为(更改应用程序大小/字体大小)取决于在操作系统的显示设置中设置的缩放。

qt dpi
1个回答
2
投票

我最初建议在这个答案中使用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,下面的答案的前一部分就可以使用了。


以前的答案,适用一旦Qt修复他们的缩放错误

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.