如何更改 QML 应用程序的逻辑 DPI?

Posted

技术标签:

【中文标题】如何更改 QML 应用程序的逻辑 DPI?【英文标题】:How to change logical DPI for QML app? 【发布时间】:2014-03-07 01:30:03 【问题描述】:

我想在我的 Qt 5.2.1 QML/C++ 应用程序中控制所有 Text 元素的 pointSize 到像素的缩放。

我有一个 QML 单例组件,它具有宽度、高度和点间距等目标显示属性,可以计算常见尺寸的适当像素大小,例如触摸屏按钮的推荐大小(以像素为单位)。这适用于我编写的控件,但 Text 元素有一个非常好的 font.pointSize,如果我可以设置用于文本缩放的逻辑 DPI,我想使用它。

在我的 96 DPI 开发屏幕上进行调试时,我使用它来模拟具有非常不同屏幕 DPI 的目标设备。例如,我想运行针对 1280x720 133DPI 显示器并具有如下元素的应用程序:

Text  font.pointSize: 72; text: “Xy” 

显示 133 像素高,而不是 96 像素高的文本,因为操作系统告诉 Qt 我连接了 96 DPI 显示器。我想覆盖我的应用程序的逻辑 DPI 缩放。

我可以通过 QGuiApplication QScreen 列表看到 logicalDotsPerInchX。有大量关于如何获取逻辑 DPI 的文档。但我找不到任何有关如何更改它的信息。

如何更改我的 Qt 应用程序的逻辑 DPI?

【问题讨论】:

【参考方案1】:

我认为您不能简单地更改 QScreen 类中的 DPI 值(只有公共 getter 方法)。 如果您修改 QScreen 类并自己添加一个公共设置器或其他东西然后重新编译 Qt,那么可能会有一些“黑客”解决这个问题,但这可能是一些工作并且需要很多时间......

另一种解决方案可能是为您的字体大小添加比例因子?我不知道你有多少,但这可以简单地在 QML 中完成,我甚至在生产设置中也使用类似的东西来正确缩放字体和其他大小以适应设备。 您可以use Screen.pixelDensity 或只定义您的自定义 QML 属性并将其乘以所有字体大小?如果这样做,您可以在应用运行时动态更改大小。

【讨论】:

我希望不是这样,但你是对的。我最终得到了与您的建议类似的解决方案;我注册了一个 C++ 单例,它跟踪 DPI 并为 pt、mm 和 in(ches) 提供常量。例如:文本 文本:'hi'; font.pixelSize: 24*UI.pt Qt 5.5 和 5.6 中的高 DPI 支持改善了问题,但如果缩放因子不是整数,则会出现锯齿问题。我的课程很容易使用,我不需要高 DPI 支持,但我正在做嵌入式开发;高 DPI 非常适合桌面应用。 我认为这取决于平台插件(例如对于 X windows 它将是 libxcb)如何从 X 服务器获取 dpi,以及是否可以覆盖它,例如在命令行上?你有没有找到一个好的解决方案?我正在为嵌入式 linux 设备在高 DPI 显示器上进行交叉编译,出于某种原因,目标应用程序似乎认为它处于高 dpi 环境中(不是我想要的)

以上是关于如何更改 QML 应用程序的逻辑 DPI?的主要内容,如果未能解决你的问题,请参考以下文章

更改后,QT QML资源文件不会重新编译

如何创建与 Windows 7 向后兼容的缩放和大小更改的 Per-Monitor DPI 感知应用程序?

如何在 QML 中进行基于状态的模型更改

如何在Python和Qt Quick QML应用程序中实现简化的双向数据绑定

如何重置 VisualTreeHelper.GetDpi() 以返回真正的 DPI?

QML 焦点如何传播?