Tho*_*mas 7 linux qt dpi highdpi xorg
我正在开发一个需要在各种投影仪上运行的 Qt 应用程序(部署到 Qt 5.11,但我正在 Qt 5.14 上进行测试)。这些投影仪中至少有一台报告的物理尺寸超过一米,这导致向 Linux 操作系统报告的分辨率仅为 32.5 dpi(与默认值 96 dpi 相比)。此设置对我们的 Qt 应用程序的影响是所有文本都变得难以阅读:
它可以通过运行在任何系统上复制
xrandr --dpi 32.5
Run Code Online (Sandbox Code Playgroud)
在启动应用程序之前。
我们可以不同地配置系统 dpi,但有理由不这样做:这个 dpi 实际上是在正确的范围内(它甚至太高),我们可能想在其他应用程序中使用它,客户可能会使用自己的投影仪,这可能会损坏我们的手动配置。
这个特定用例的安全方法是假装我们仍然生活在石器时代:忽略系统 dpi 设置,只使用设备无关像素和设备像素之间的 1:1 映射。在高DPI显示文档说:
Qt::AA_DisableHighDpiScaling
Qt 5.6 中引入的application 属性关闭所有缩放。这适用于需要实际窗口系统坐标的应用程序,而不管环境变量如何。此属性优先于Qt::AA_EnableHighDpiScaling
。
所以我将其添加为第一行main
(在QApplication
创建之前):
QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling);
Run Code Online (Sandbox Code Playgroud)
然而,它似乎没有效果;文字仍然小得无法阅读。我还尝试了以下各种组合:
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, false);
QCoreApplication::setAttribute(Qt::AA_Use96Dpi);
Run Code Online (Sandbox Code Playgroud)
没有任何可见的效果效果。
什么做的工作是设置QT_AUTO_SCREEN_SCALE_FACTOR=1
在环境中。如果我理解正确,这将启用缩放而不是禁用它,但将其设置为0
不起作用!
同样,如果我在这样的代码中启用 Qt::AA_EnableHighDpiScaling
,一切都变得可读:
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
Run Code Online (Sandbox Code Playgroud)
在某种程度上也有效的是硬编码字体大小(在这里找到):
QFont font = qApp->font();
font.setPixelSize(11);
qApp->setFont(font);
Run Code Online (Sandbox Code Playgroud)
然而,布局中的边距似乎仍然被缩放,因此这会导致布局非常狭窄(尽管可用)。
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 错误。可能相关:
那么我怎样才能让它在所有情况下都能可靠地工作呢?
以下是我最终在 Qt 5.11 上强制禁用任何缩放功能所做的操作:
QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling);
if (qgetenv("QT_FONT_DPI").isEmpty()) {
qputenv("QT_FONT_DPI", "84");
}
Run Code Online (Sandbox Code Playgroud)