gpt4 book ai didi

linux - 为什么 Qt::AA_DisableHighDpiScaling 不禁用高 DPI 缩放,为什么 Qt::AA_EnableHighDpiScaling 禁用它?

转载 作者:行者123 更新时间:2023-12-04 11:29:05 26 4
gpt4 key购买 nike

我正在开发一个需要在各种投影仪上运行的 Qt 应用程序(部署到 Qt 5.11,但我正在 Qt 5.14 上进行测试)。这些投影仪中至少有一台报告的物理尺寸超过一米,这导致向 Linux 操作系统报告的分辨率仅为 32.5 dpi(与默认值 96 dpi 相比)。此设置对我们的 Qt 应用程序的影响是所有文本都变得难以阅读:

Screenshot of problem

它可以通过运行在任何系统上复制

xrandr --dpi 32.5

在启动应用程序之前。

我们可以不同地配置系统 dpi,但有理由不这样做:这个 dpi 实际上是在正确的范围内(它甚至太高),我们可能想在其他应用程序中使用它,客户可能会使用他们自己的投影仪,这可能会损坏我们的手动配置。

这个特定用例的安全方法是假装我们仍然生活在石器时代:忽略系统 dpi 设置,只使用设备无关像素和设备像素之间的 1:1 映射。 High DPI displays文档说:

The Qt::AA_DisableHighDpiScaling application attribute, introduced in Qt 5.6, turns off all scaling. This is intended for applications that require actual window system coordinates, regardless of environment variables. This attribute takes priority over Qt::AA_EnableHighDpiScaling.



所以我把它添加为 main 的第一行(在创建 QApplication 之前):
QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling);

然而,它似乎没有效果;文字仍然小得无法阅读。我还尝试了以下各种组合:
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, false);
QCoreApplication::setAttribute(Qt::AA_Use96Dpi);

没有任何可见的效果效果。

有效的是设置 QT_AUTO_SCREEN_SCALE_FACTOR=1在环境中。如果我理解正确,这将启用缩放而不是禁用它,而是将其设置为 0不起作用!

同样,如果我启用 Qt::AA_EnableHighDpiScaling在这样的代码中,一切都变得可读:
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

在某种程度上也有效的是硬编码字体大小(找到 here ):
QFont font = qApp->font();
font.setPixelSize(11);
qApp->setFont(font);

然而,布局中的边距似乎仍然被缩放,因此这会导致布局非常狭窄(尽管可用)。

同样有效的是设置 QT_FONT_DPI=96在环境中(这个变量似乎没有记录,但它至少在 Qt 5.11 和 5.14 中有效)。

Qt 中存在错误,或者更有可能是我误解了某些东西。为什么启用缩放似乎禁用它,反之亦然?

编辑:也刚刚在 Qt 5.11 上进行了测试,尽管它是在另一个系统上。那里,没有 QT_AUTO_SCREEN_SCALE_FACTOR=1也不是 QT_AUTO_SCREEN_SCALE_FACTOR=0有效,所以看来我们毕竟在某种程度上正在处理 Qt 错误。可能相关:
  • High DPI scaling not working correctly - 已关闭 超出范围
  • HighDPi: Update scale factor setting for devicePixelRatio scaling (AA_EnableHighDpiScaling) - 已在 5.14 中完成
  • Support of DPI Scaling Level for Displays in Windows 10 - 报告未解决
  • Qt uses wrong source for logical DPI on X - 报告未解决 - 这可能是我看到的问题的根本原因。
  • Uselessness of setAttribute(Qt::AA_EnableHighDpiScaling) - 报告未解决

  • 那么我怎样才能让它在所有情况下都能可靠地工作呢?

    最佳答案

    这是我最终在 Qt 5.11 上强制禁用任何缩放的操作:

        QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling);
    if (qgetenv("QT_FONT_DPI").isEmpty()) {
    qputenv("QT_FONT_DPI", "84");
    }

    关于linux - 为什么 Qt::AA_DisableHighDpiScaling 不禁用高 DPI 缩放,为什么 Qt::AA_EnableHighDpiScaling 禁用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59947058/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com