2017-02-08 58 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 **)。 –