Qt 为什么不';当我将窗口移动到具有不同DPI的屏幕时,我的QML项目是否会被缩放?

Qt 为什么不';当我将窗口移动到具有不同DPI的屏幕时,我的QML项目是否会被缩放?,qt,windows-10,qml,dpi,Qt,Windows 10,Qml,Dpi,我使用的是Windows10和Qt5.15.1。当我将QML应用程序窗口从低DPI屏幕(100%比例)移动到高DPI屏幕(125%比例)时,窗口会按预期放大(调整大小)以使用更多像素。这使得窗口在两个屏幕上显示为相同的物理大小 但是窗口中的项目不可缩放——它们保持相同的像素数。因此,在高DPI屏幕上,所有项目的物理尺寸都较小 当我在具有不同DPI的屏幕之间移动窗口时,如何使项目缩放(到相同的物理大小)?我希望所有项目都出现这种情况,如文本、按钮、矩形等 我的QML是: import QtQuic

我使用的是Windows10和Qt5.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_()

对我来说,使用更高的DPI会改变应用程序的尺寸,这其实很奇怪。但这并不是真正的“缩放”。它只是让窗户变大了。而且您没有将
矩形的大小
绑定到
应用程序窗口
,因此它的大小保持不变。这里简单的答案是你可以这样做:

    Rectangle {
        anchors.fill: parent
        color: "green"
    }
这将使矩形保持与应用程序相同的大小

如果您确实希望应用程序的所有内容(包括矩形的子项)随着应用程序窗口大小的变化而缩放,则可以执行以下操作:

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会改变应用程序的尺寸,这其实很奇怪。但这并不是真正的“缩放”。它只是让窗户变大了。而且您没有将
矩形的大小
绑定到
应用程序窗口
,因此它的大小保持不变。这里简单的答案是你可以这样做:

    Rectangle {
        anchors.fill: parent
        color: "green"
    }
这将使矩形保持与应用程序相同的大小

如果您确实希望应用程序的所有内容(包括矩形的子项)随着应用程序窗口大小的变化而缩放,则可以执行以下操作:

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
        }
    }
}
我学会了在默认情况下使用整数。所以在我的屏幕上,125%的缩放比例,它被四舍五入到100%。。。因此没有变化

通过将环境变量
QT\u SCALE\u FACTOR\u ROUNDING\u POLICY
设置为
PassThrough
,可以禁用此行为。或在代码中:

QtGui.QGuiApplication.setHighDpiScaleFactorRoundingPolicy(
    Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
或者,如果您知道监视器的比例因子,可以通过设置
QT_SCREEN_scale_factors
环境变量(如
QT_SCREEN_scale_factors=1.25)直接指定它们;1

现在我在两个屏幕上都得到了预期的自动缩放

我了解到,默认情况下,这是一个整数。所以在我的屏幕上,125%的缩放比例,它被四舍五入到100%。。。因此没有变化

通过将环境变量
QT\u SCALE\u FACTOR\u ROUNDING\u POLICY
设置为
PassThrough
,可以禁用此行为。或在代码中:

QtGui.QGuiApplication.setHighDpiScaleFactorRoundingPolicy(
    Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
或者,如果您知道监视器的比例因子,可以通过设置
QT_SCREEN_scale_factors
环境变量(如
QT_SCREEN_scale_factors=1.25)直接指定它们;1

现在我在两个屏幕上都得到了预期的自动缩放


我的问题是矩形没有被缩放到与用户相同的视觉大小。只有窗口的大小被正确调整。文本也有同样的问题——在DPI较高和较低的屏幕上,文本的像素数相同。在高DPI屏幕上,文本应该放大并使用更多像素,以便在两个屏幕上显示相同的物理大小。您是否尝试了我的第二个示例?这样也可以缩放文本。我不想将控件与窗口大小绑定。我只是想让它们适当地缩放。假设我将
矩形
替换为
文本
。我将更新我的问题,因为我认为
矩形
具有误导性。我的问题是,矩形没有被缩放到与用户相同的视觉大小。只有窗口的大小被正确调整。文本也有同样的问题——在DPI较高和较低的屏幕上,文本的像素数相同。在高DPI屏幕上,文本应该放大并使用更多像素,以便在两个屏幕上显示相同的物理大小。您是否尝试了我的第二个示例?这样也可以缩放文本。我不想将控件与窗口大小绑定。我只是想让它们适当地缩放。假设我将
矩形
替换为
文本
。我将更新我的问题,因为我认为
矩形
具有误导性。您的main中是否有这一行。cpp:
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling)?main.cpp中是否有这一行:
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling)?很高兴知道!很高兴你弄明白了。很高兴知道!很高兴你弄明白了。