【问题标题】:QML scaling does not work with non-integer scaling factorsQML 缩放不适用于非整数缩放因子
【发布时间】:2017-10-15 06:57:03
【问题描述】:

我正在使用 QML 编写应用程序。当我通过非整数因子缩放 GUI 时遇到问题。 According to the docsQt::AA_EnableHighDpiScaling 应该启用与设备无关的像素,因此会自动处理大部分缩放:

应用属性Qt::AA_EnableHighDpiScaling,在 Qt 5.6,启用基于像素密度的自动缩放 监视器。

blog post about 5.6 中,他们承认可能存在问题:

问:是否支持非整数比例因子?

答:Qt 在 API,并允许通过设置非整数比例因子 QT_SCALE_FACTOR。但是,Qt 不保证图形和 在这种情况下,样式将不会出现故障。样式可能首先中断: 融合风格通常是最具可扩展性的。 Qt 平台插件回合 报告的比例因子到最接近的整数。

并在评论中:

问:这是否意味着它仍然是有效的整数?具有 150% DPI 比例的 Windows 会发生什么情况?

答:是的,除非您使用 QT_SCALE_FACTOR 手动设置/更正它。 150% 应该是 2 倍。

所以对我来说,当缩放到 150% 时,这会导致一个可笑的大 GUI。但是,文本正确缩放会导致奇怪的伪影,例如带有小文本的大按钮。

我是误解了它的工作原理还是真的不可能?

【问题讨论】:

  • 我也遇到了一些问题。所以现在我通过传递命令行参数并利用 Qt.application.arguments 手动扩展应用程序。
  • 似乎有一些朝着更完整解决方案的方向发展:bugreports.qt.io/browse/QTBUG-53022

标签: windows qt user-interface qml


【解决方案1】:

正如评论中提到的,我对QT_SCALE_FACTOR 不满意,所以我决定自己做,并创建了一个这样的ScaleableWindow

import QtQuick 2.0
import QtQuick.Controls 2.0

ApplicationWindow {
    id: root
    property real scale: 1
    property real unscaledWidth: 100
    property real unscaledHeight: 100

    Component.onCompleted: {
        var i = Qt.application.arguments.indexOf('--scale')
        if (i > -1 && Qt.application.arguments[i+1]) scale = parseFloat(Qt.application.arguments[i+1])
    }

    width: unscaledWidth * scale
    height: unscaledHeight * scale

    property alias scaledContentItem: scaledContent
    default property alias scaledContent: scaledContent.data

    Item {
        id: scaledContent
        width: root.unscaledWidth
        height: root.unscaledHeight
        scale: root.scale
        anchors.centerIn: parent
    }
}

您现在可以通过传递来指定比例因子,例如命令行参数--scale 0.4

您也可以尝试使用Screen.pixelDensity 来计算比例因子,但这依赖于显示器正确发布其像素密度,这对我来说经常失败。

您还可以使用它来创建一个在调整窗口大小时自动缩放内容的窗口。


所以如果问题是 环境变量是否可能 - 我不这么认为。如果问题是是否可以根据一些外部输入来缩放窗口及其内容 - 这是一个解决方案。

【讨论】:

  • 这看起来是一个有趣的解决方案,我有点惊讶它应该这么简单。你也试过Screen.devicePixelRatio吗?你保留Qt::AA_EnableHighDpiScaling了吗?
  • 不,我没有设置任何环境变量了。
  • Screen.devicePixelRatio 有一个花哨的文档:普通屏幕上的 1.0 和 Apple 视网膜显示器上的 2.0 - 认真吗? MS Surface 上有什么?什么是普通屏幕?我不敢用那个:D
  • 对于想要根据显示器的 DPI 设置缩放 UI 的情况,您有解决方案吗?目前我想为所有整数比例因子启用高 dpi 并为其他所有内容禁用它,但我没有看到这样做的方法。
  • (更新 2):我很感兴趣并开始了一段旅程:Screen.devicePixelRatio 返回d->platformScreen->devicePixelRatio() * QHighDpiScaling::factor(this);,其中devicePixelRatio() 在 Windows 上被硬编码为1.0QHighDpiScaling 是一个有趣的类,有很多文档。
猜你喜欢
  • 2015-09-24
  • 2023-03-21
  • 2018-11-27
  • 2016-01-25
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
相关资源
最近更新 更多