Qt Quick Controls 2 缩放

3
我正在开发一款应用程序,它应该可以在移动和桌面平台上运行。我发现的问题是控件的大小在不同的屏幕上会有所不同:在高密度屏幕上,控件太小,在低密度屏幕上则相当大。
我可以为每个屏幕计算比例因子(即使用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控件。

因此,我正在寻找一种方法,在不重新定义所有控件的情况下缩放标准控件。

更新1。 我尝试了高DPI支持,情况有所改善,但仍存在一些问题。 这里是不同设备的主屏幕的一些参数(在此处查看参数描述)在应用高DPI支持之前和之后:

// 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接近160。

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


我几年前也曾经问过这个问题,最终我采用了与你类似的自定义浸润和吸收计算方法... 我仍然认为在Qt或QML中没有内置任何标准。 - Xander
你是通过 dip 和 sip 重新定义所有的 Qt Quick Controls 2 组件吗?还是根本不使用 Qt Quick Controls 2? - Kamil Zaripov
我觉得你不理解这个问题。我也使用dp(dip)和sp(sip)来定义项目大小和字体大小,我没有发现任何问题。问题与Qt Quick Controls 2中的项目有关,比如ComboBoxButton。这些项目的大小是以像素为单位定义的。你可以在这里看到。所以它们不会根据显示器进行缩放。这就是问题所在。 - Kamil Zaripov
是的,当放置控件时,您可以覆盖控件的大小,但有些控件由子项组成(例如ComboBox),您必须重写所有部件的所有大小,这几乎等同于重写整个控件。 - Kamil Zaripov
1
为了手动设置特定的比例因子,例如在创建应用程序实例之前,在main()中尝试使用qputenv("QT_SCALE_FACTOR", "3"); - jpnurmi
显示剩余2条评论
2个回答

2

是的,它解决了一些高dpi显示器的问题,但还存在一些问题(请参见UPD1)。 - Kamil Zaripov

1

我曾经遇到同样的问题,从jpnurmi那里找到了最有帮助的答案:添加

qputenv("QT_SCALE_FACTOR", "3"); 

在创建应用程序实例之前的main()函数中。 对于视网膜显示器,0.75的因子非常适用,因为控件实际上太大了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接