Qt Quick Controls 2 缩放

Qt Quick Controls 2 Scaling

我正在开发应该 运行 在移动和桌面平台上的应用程序。我发现控件大小在不同屏幕上的问题:在高密度屏幕上控件太小,在低密度屏幕上相当大。

我可以计算每个屏幕的比例因子(即使用 Android 的密度无关像素)并用它来定义 dp 中的项目大小、边距等:

ApplicationWindow {
    ...
    property real dp: Screen.pixelDensity * 10 * 2.54 / 160
    Item {
        width: 50*dp
        height: 50*dp
        ...
        Label {
            font.pixelSize: 16*dp
            ...
        }
    }
}

它运行良好,但似乎 Qt Quick Controls 2 中标准控件的大小是以像素为单位定义的,因此它们无法缩放。我看到的唯一方法是使用 dp 而不是像素重新定义 Qt Quick Controls 2 中的所有控件。

所以我正在寻找无需重新定义所有标准控件即可缩放标准控件的方法。

UPD1. 我已经尝试过高 DPI 支持,它使情况变得更好,但仍然存在一些问题。 以下是应用高 DPI 支持前后不同设备的主屏幕(see paramter description here)的一些参数:

// samsung tab t-280 without high dpi support
devicePixelRatio 1
geometry QRect(0,0 800x1280)
logicalDotsPerInch 95.85
physicalDotsPerInch 216.458
physicalSize QSizeF(94, 150) (7')

// samsung tab t-280 with high dpi support
devicePixelRatio 1.33125
geometry QRect(0,0 601x962)
logicalDotsPerInch 72
physicalDotsPerInch 162.648
physicalSize QSizeF(94, 150) (7')


// xiaomi redmi 2 without high dpi support
devicePixelRatio 1
geometry QRect(0,0 720x1280)
logicalDotsPerInch 144
physicalDotsPerInch 315.48
physicalSize QSizeF(58, 103) (4.6')

// xiaomi redmi 2 with high dpi support
devicePixelRatio 2
geometry QRect(0,0 360x640)
logicalDotsPerInch 72
physicalDotsPerInch 157.74
physicalSize QSizeF(58, 103) (4.6')


// macbook pro retina 13' without high dpi support
devicePixelRatio 2
geometry QRect(0,0 1280x800)
logicalDotsPerInch 72
physicalDotsPerInch 113.5
physicalSize QSizeF(286.449, 179.031) (13')

// macbook pro retina 13' with high dpi support
devicePixelRatio 2
geometry QRect(0,0 1280x800)
logicalDotsPerInch 72
physicalDotsPerInch 113.5
physicalSize QSizeF(286.449, 179.031) (13')


// generic 20' display without high dpi support
devicePixelRatio 1
geometry QRect(0,0 1280x1024)
logicalDotsPerInch 72
physicalDotsPerInch 72
physicalSize QSizeF(451.556, 361.244) (22.6')

// generic 20' display with high dpi support
devicePixelRatio 1
geometry QRect(0,0 1280x1024)
logicalDotsPerInch 72
physicalDotsPerInch 72
physicalSize QSizeF(451.556, 361.244) (22.6')


// asus zenbook 13' without high dpi support
devicePixelRatio 1
geometry QRect(0,0 1366x768)
logicalDotsPerInch 96
physicalDotsPerInch 71.9833
physicalSize QSizeF(482, 271) (21.6'!)

// asus zenbook 13' with high dpi support
devicePixelRatio 1
geometry QRect(0,0 1366x768)
logicalDotsPerInch 96
physicalDotsPerInch 71.9833
physicalSize QSizeF(482, 271) (21.6'!)

对于某些高 DPI 显示器(三星平板电脑和小米 Phone),情况似乎有所好转。应用高DPI支持后,两台设备的DPI都接近160。

但 Retina 显示屏和低密度显示屏的 DPI 没有变化,屏幕上的项目看起来比应有的大。所以它只解决了原始问题的一半。也许有人知道如何在 运行 时间为所有 Qt 应用程序手动设置比例因子?

似乎从 Qt 5.6 版开始,可能会有更好的平台独立缩放解决方案。

High-DPI Qt Quick Controls 2 中的支持 https://doc.qt.io/qt-5/qtquickcontrols2-highdpi.html

希望对您有所帮助。

我遇到了同样的问题,发现 jpnurmi 的答案最有帮助:add

qputenv("QT_SCALE_FACTOR", "3"); 

在创建应用程序实例之前在 main() 中。 0.75 的系数对我来说非常适用于 Retina 显示器,其中控件实际上太大了。