QQuickView 标题栏在辅助监视器上太大

QQuickView title bar too large on secondary monitor

当我将 window 移动到我的辅助显示器时,我的 QQuickView Qt 应用程序的标题栏太大。它在我的主显示器上正确显示。如果我使用 QWidget 而不是 QQuickView.

,标题栏的大小是正确的

是否可以使 QQuickView 应用程序的标题栏正确显示?如果是,怎么做?

我在 Windows 10 版本 1803 上使用 PySide2 版本 5.15.0。我的主显示器 DPI 设置为 125%,我的辅助显示器设置为 100%。该应用程序 运行 作为“per-monitor DPI 感知”。 Qt documentation on high DPI support 对解决这个问题没有任何帮助。我尝试了各种 DPI 设置和环境变量。

test.py

from PySide2 import QtWidgets
from PySide2.QtCore import QUrl
from PySide2.QtQuick import QQuickView

if __name__ == '__main__':
    app = QtWidgets.QApplication([])

    view = QQuickView()
    view.setResizeMode(QQuickView.SizeRootObjectToView)
    view.setSource(QUrl('view.qml'))
    view.show()

    app.exec_()

view.qml

import QtQuick 2.0

Rectangle {
    width: 300
    height: 200
    color: "green"

    Text {
        text: "Hello World"
        anchors.centerIn: parent
    }
}

解决方案

感谢@eyllanesc 提供有关如何尝试不同渲染器的提示。

通过在实例化 QApplication object:

之前添加以下行之一,将 Qt 配置为使用 ANGLE 渲染器
QtWidgets.QApplication.setAttribute(Qt.AA_UseOpenGLES)
os.environ['QT_OPENGL'] = 'angle'

有关含义,请参阅 Qt 5 on Windows ANGLE and OpenGL

背景

在 Windows 上使用 OpenGL 渲染器的 Qt Quick 应用程序中正确缩放 non-client 区域(标题栏)似乎存在一些长期存在的问题。

Qt 错误报告 QTBUG-78143 是关于 non-client 项在 dpiawareness2 时未缩放的。该 bug 已作为 Windows 的问题关闭,Microsoft 知道但尚未修复。

还有更老的QTBUG-65804也讲了同样的问题

QTBUG-68712 talks about implementing a new Windows value, DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2,但它会带回一个较旧的错误,直到 Microsoft 修复某些东西。

我发现 an SO question 也有很多讨论。