【问题标题】:What is the best way to scale images for high DPI in Qt5?在 Qt5 中为高 DPI 缩放图像的最佳方法是什么?
【发布时间】:2018-10-13 22:05:36
【问题描述】:

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

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

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

【问题讨论】:

  • 你可以从阅读doc.qt.io/qt-5/highdpi.html开始
  • 谢谢,我去过,但我不认为它准确描述了我在图像和系统比例因子方面想要实现的目标。
  • 我害怕那个,所以我说“开始”。我想我是过于乐观了,你肯定不会是第一个遇到这个问题的人。
  • 如果您使用的是 Qt 5.6 或更高版本,您可以尝试在您的QApplication 上设置Qt::AA_EnableHighDpiScaling 属性。

标签: c++ windows qt scaling highdpi


【解决方案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;

【讨论】:

  • 谢谢,我认为像这样计算比例因子是唯一可以做到的。您和 Sergio 的回答非常有帮助。
【解决方案2】:

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

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

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

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

【讨论】:

  • 谢谢,看来计算比例因子可能是答案。将整个窗口(包括标题栏和关闭按钮)拖到我的第二个标准 DPI 显示器时,我遇到了问题。我认为这可能会在另一个问题中得到更好的解决,因此我将您的问题标记为答案。
  • 我的荣幸。这是 Windows 上的一个已知限制。一旦窗口完全在另一个屏幕上,它应该会正确调整大小。
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 2019-10-29
  • 2011-01-24
  • 2010-09-11
  • 2021-12-21
  • 2019-11-17
  • 2017-04-04
  • 2021-02-14
相关资源
最近更新 更多