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

时间:2018-05-03 14:34:52

标签: c++ windows qt scaling highdpi

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

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

我很感激任何建议。

2 个答案:

答案 0 :(得分:1)

这个问题也打败了我。在Qt的错误跟踪器 here中也会报告。

问题在于,通过将所有像素缩放1.5倍,在Windows上进行150%缩放,而是缩放字体并调整"用户界面相应的。这就是为什么当选择150%缩放时,间距和布局看起来很奇怪。

由于 devicePixelRatio()查询实际像素比率,并且在Windows上将其设置为150%时未更改,因此它仍会返回1.

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

答案 1 :(得分:1)

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

  

保持屏幕与物理像素之间的比率   与设备无关的像素

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;