Qt Quick(Python)窗口在不同屏幕缩放问题

前言

Qt Quick开发的窗口,如果电脑是双屏,两个屏幕的缩放比例如果不一样就会发现,窗口在第一次显示的屏幕上是正常的,拖放到另一个屏幕上就会出问题。

本文是在PySide2_5.15.2上测试的。

这是Qt的BUG

Qt rounds DPI scaling在默认情况下是整型的。它的策略是4舍5入。

假如屏幕上使用125%的缩放比例,它被四舍五入为100%,所以窗口大小不会变化,但是内容却会正常缩放,就会导致窗口和内容缩放不一致。

解决方法

解决方法:

修改默认的缩放策略,不让它4舍5入。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from PySide2.QtCore import QCoreApplication, Qt
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine

if __name__ == "__main__":

QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
QCoreApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)
QGuiApplication.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)

app = QGuiApplication(sys.argv)

engine = QQmlApplicationEngine()
qml_url = QUrl("qrc:/main.qml")
engine.load(qml_url)

if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())

主要是以下几行

1
2
3
QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
QCoreApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)
QGuiApplication.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)

这个问题在Qt6.2.3上是已经都解决掉了的。