2017-02-08 60 views
3

我正在开发应该在移动和桌面平台上运行的应用程序。我发现控制器的大小在不同的屏幕上会有所不同:在高密度屏幕中,控件太小,而在低密度屏幕中则相当大。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支持,它使情况更好,但仍然存在一些问题。 下面是从不同的设备主屏幕(see paramter description here)的某些部分参数之前并应用高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的显示器(三星平板电脑和小米手机)更好。高DPI支持申请后,两台设备的DPI接近160。

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

+0

多年前我问过自己,最后我用了一个类似的方法,然后用自定义dip和sip计算...我仍然不认为它在Qt或QML中构建任何标准 – Xander

+0

因此,您重新定义了所有Qt快速控制2项使用dip和sip?或者你根本不使用Qt Quick Controls 2? –

+0

嗯,实质上是的,每当我定义视觉QML项目的大小或位置以及字体大小的sp时,我都会使用dp。这听起来很愚蠢,但它的工作原理并不简单。但是我使用了全局C++类,并将其注册为QML上下文对象。如果你想我可以发布该类作为答案,因为它在我的私人存储库。 – Xander

回答

1

我有同样的问题,并找到了答案,从jpnurmi最有帮助。 对于我来说,Retina显示屏的控制系数实在太大,0.75的系数非常好。

2

似乎自从Qt5.6版本以后,可能会有更好的解决方案来平台idependant缩放。

高DPI支持在Qt Quick的控制2 https://doc.qt.io/qt-5/qtquickcontrols2-highdpi.html

我希望帮助。创建应用程序实例之前,在主加

qputenv("QT_SCALE_FACTOR", "3"); 

():

+0

是的,它解决了一些高分辨率显示器的问题,但有一些问题(请参阅** UPD1 **)。 –