在 Qt5 中为高 DPI 缩放图像的最佳方法是什么?

What is the best way to scale images for high DPI in Qt5?

我们的应用程序中有各种图像(从 QLabel 中的 QPixmap 显示)在非高 DPI 屏幕上以合理的尺寸显示,但在高 DPI 上缩小。其他 UI 个元素看起来不错。

我查看了 devicePixelRatioF() 函数,但它总是 returns 1. 在我的系统上,我启用了 150% 缩放比例,因此如果我将 1.5 硬编码为比例因子,则图像符合预期尺寸相对于 window。问题是,如何获得系统比例因子,以便使应用程序在具有不同 DPI/缩放比例的系统中看起来一致?与 Windows 一样,该应用程序是为 Linux.

构建的

如有任何建议,我将不胜感激。

这个问题也难倒了我。它也在 Qt 的 bug 跟踪器 here.

中报告

问题是 Windows 上的 150% 缩放 不是 通过将所有像素缩放 1.5 倍来执行,而是缩放字体和 "adjusting" UI 相应地。这就是为什么在选择 150% 缩放时间距和布局看起来很奇怪的原因。

由于devicePixelRatio()查询的是实际像素比,在Windows上设置为150%不变,所以还是returns1 .

如果您确实需要 1.5 值来正确缩放您的像素图,您可以通过查询屏幕的 DPI 自行计算实际系数(查看文档 here)。

关于 高 DPI 屏幕:我认为你应该看看 QScreen::devicePixelRatio 属性,其中

holds the screen's ratio between physical pixels and device-independent pixels

use the returned value to set the pixmap ratioQPixmap::setDevicePixelRatio

例如:

#include <QApplication>
#include <QDebug>
#include <QScreen>
#include <QPixmap>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPixmap p(32, 32);
    QScreen * screen = a.primaryScreen();
    p.setDevicePixelRatio(screen->devicePixelRatio());

    //...

    return a.exec();
}

关于系统缩放,你可以有一个线索测试QScreen::logicalDotsPerInch 属性,例如:

int scaling_percent = (screen->logicalDotsPerInch() / 96) * 100;