【问题标题】:Why aren't my QML items being scaled when I move the window to a screen with a different DPI?当我将窗口移动到具有不同 DPI 的屏幕时,为什么我的 QML 项目没有被缩放?
【发布时间】:2020-09-17 13:40:06
【问题描述】:

我使用的是 Windows 10 和 Qt 5.15.1。当我将 QML 应用程序窗口从低 DPI 屏幕(100% 比例)移动到高 DPI(125% 比例)屏幕时,窗口按比例放大(调整大小)以使用更多像素,正如预期的那样。这使得窗口在两个屏幕上看起来具有相同的物理尺寸。

但是,窗口中的项目不会缩放——它们保持相同的像素数。因此,所有项目在高 DPI 屏幕上看起来都更小。

当我在具有不同 DPI 的屏幕之间移动窗口时,如何使项目缩放(到相同的物理尺寸)?我希望所有项目都发生这种情况,例如文本、按钮、矩形等。

我的 QML 是:

import QtQuick 2.12
import QtQuick.Controls 2.12

ApplicationWindow {
    visible: true
    width: 240
    height: 60

    Text {
        text: "Hello World"
        font.pointSize: 14
    }

}

我的 Python 是:

QtCore.QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
QtCore.QCoreApplication.setAttribute(Qt.AA_UseOpenGLES)

app = QtWidgets.QApplication([])

engine = QtQml.QQmlEngine()
context = QtQml.QQmlContext(engine.rootContext())
designer = QtQml.QQmlComponent(engine, 'main.qml')
designer.create(context)

app.exec_()

【问题讨论】:

  • 你的 main.cpp 中有没有这一行:QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);?

标签: qt windows-10 qml dpi


【解决方案1】:

我了解到Qt rounds DPI scaling 默认为整数。所以在我的 125% 缩放的屏幕上,它被四舍五入到 100%……因此没有变化。

可以通过将QT_SCALE_FACTOR_ROUNDING_POLICY 环境变量设置为PassThrough 来禁用此行为as of Qt 5.14。或者在代码中:

QtGui.QGuiApplication.setHighDpiScaleFactorRoundingPolicy(
    Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)

或者,如果您知道监视器的比例因子,则可以通过设置 QT_SCREEN_SCALE_FACTORS 环境变量(如 QT_SCREEN_SCALE_FACTORS=1.25\;1)直接指定它们。

所以现在我在两个屏幕上都获得了预期的自动缩放。

【讨论】:

  • 很高兴知道!很高兴你明白了。
【解决方案2】:

对我来说,使用更高的 DPI 会改变应用的尺寸实际上很奇怪。不过,这并不是真正的“缩放”它。它只是让窗户更大。而且您没有将Rectangle 的大小绑定到ApplicationWindow,所以这就是它保持相同大小的原因。这里的简单答案是您可以这样做:

    Rectangle {
        anchors.fill: parent
        color: "green"
    }

这将使 Rectangle 保持与应用程序相同的大小。

如果您真的希望应用程序的所有内容(包括 Rectangle 的子项)随着 ApplicationWindow 大小的变化而缩放,那么您可以执行以下操作:

ApplicationWindow {
    visible: true
    width: defaultWidth
    height: defaultHeight

    property real defaultWidth: 320
    property real defaultHeight: 240

    Rectangle {
        width: defaultWidth
        height: defaultHeight
        color: "green"

        transform: Scale { 
            xScale: parent.width / defaultWidth
            yScale: parent.height / defaultHeight
        }
    }
}

【讨论】:

  • 我的问题是矩形没有被缩放为与用户相同的视觉大小。只有窗口被正确调整大小。文本有同样的问题——文本在我的更高和更低 DPI 屏幕上的像素数相同。在高 DPI 屏幕上,文本应该按比例放大并使用更多像素,以使其在两个屏幕上看起来具有相同的物理尺寸。
  • 你试过我的第二个例子了吗?这也应该缩放文本。
  • 我不想将我的控件绑定到窗口的大小。我只是希望它们正确扩展。假设我用 Text 替换了 Rectangle
  • 我会更新我的问题,因为我认为 Rectangle 具有误导性。
猜你喜欢
  • 2021-11-18
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多