【问题标题】:Qt: Why DPI decrease on increasing Scaling from OSQt:为什么 DPI 会随着操作系统的缩放而降低
【发布时间】:2019-08-30 12:12:45
【问题描述】:

我有一个 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代码:

    #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 应用程序的行为(更改应用程序大小/字体大小)取决于 OSDisplay Settings 中设置的缩放比例。

【问题讨论】:

    标签: qt dpi


    【解决方案1】:

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

    所以现在,您应该退回到查询 DPI。然而,查询逻辑 DPI,不是你现在正在做的物理DPI。用对logicalDpi() 的调用替换对physicalDpi() 函数的调用。这应该会为您提供 Microsoft Windows 报告的标准 96/120/144 DPI。

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


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

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

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

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

    【讨论】:

    • 感谢您的回复。我尝试在我的主应用程序上使用 devicePixelRatio() 并且我的应用程序中没有其他小部件。对于 100% 和 125%,它返回 1,而对于 150% 和 175%,它返回 2。EnableHighDpiScaling 为 ON。
    • @CodeZila 是的,我更新了答案。现在,您必须使用逻辑 DPI,直到 Qt 修复其缩放错误。
    猜你喜欢
    • 2020-01-31
    • 2014-01-08
    • 2012-09-22
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2019-02-22
    相关资源
    最近更新 更多