2

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

我查看了 devicePixelRatioF() 函数,但它始终返回 1。在我的系统上,我启用了 150% 的缩放,所以如果我将 1.5 硬编码为比例因子,则图像相对于窗口具有预期的尺寸。问题是,我怎样才能获得系统比例因子,以便使应用程序在具有不同 DPI / 缩放比例的系统中看起来一致?与 Windows 一样,该应用程序也是为 Linux 构建的。

我会很感激任何建议。

4

2 回答 2

3

这个问题也打败了我。Qt的bug tracker 中也有报告。

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

由于devicePixelRatio()查询的是实际的像素比,并且在 Windows 上设置为 150% 时没有改变,所以它仍然返回 1。

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

于 2018-05-03T14:59:56.497 回答
1

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

保存物理像素和与设备无关的像素之间的屏幕比例

并使用返回的值来设置像素图比例QPixmap::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;
于 2018-05-03T16:17:10.650 回答