1. 程式人生 > >QML跨平臺佈局注意事項

QML跨平臺佈局注意事項

QML跨平臺佈局注意事項

1、本部落格解決的問題:羅列出qml程式在跨平臺下,各個元件之間的佈局使用事項,僅在windows和linux上進行測試,mac和安卓暫時未進行測試。

2、問題前言:在使用qml進行誇平臺開發的時候,往往會出現很多意料之外的問題,最大的一個問題就是各個元件之間的位置關係,本文針對此問題,總結如下幾點建議,如有不妥之處,還請見諒。

3、問題描述:由於筆者的work需要,在windows上進行程式碼編譯後需要到linux系統上進行執行,有時候在佈局上總是莫名其妙的出現位置錯位的情況,在windows平臺上顯示是符合需要的,但是到了linux上,位置就變了(指定確切的座標不會,使用佈局可能會),經過各種搜尋答案(幾乎為0),經自己的測試,總結了如下幾點跨平臺開發佈局使用建議。

4、佈局建議

4.1  使用絕對座標位置,如明確指明 x, y, width, height 的數值;
4.2  在無法確定明確位置的時候,儘量使用錨(anchors)佈局;
4.3  功能板塊儘量進行分割槽域(分塊)進行佈局;
4.4  元件之間儘量不要使用相對佈局:
4.5  平行關係儘量避免巢狀相對佈局;

注:qml佈局渲染效能比較:絕對位置佈局 > 錨(anchors)佈局 > 相對佈局(效能從優到劣)
參考qml效能的一些建議

5、相關的佈局建議程式碼示例:(注:部分程式碼參考Qt官方程式碼,自己不想再重新去編寫)

5.1 使用絕對佈局:明確指明元件的座標位置和大小等屬性,不需要JavaScript去推導位置,效能最好,但是對於自動伸縮需要做特殊處理,參考程式碼如下:

    Rectangle{
        x: 100
        y: 200
        width: 100
        height: 200
    }

5.2 使用錨(anchors)佈局:此佈局方式也是Qt官方比較推薦的一種佈局方式,效能可能稍遜於絕對佈局,但是能夠做到自動伸縮佈局的特性,推薦使用,參考程式碼如下:

Rectangle {
    id: rect1
    x: 20
    width: 200; height: 200
}
Rectangle {
    id: rect2
    height: 200
    anchors.left: rect1.left
    anchors.top: rect1.bottom
    anchors.right: rect1.right
    anchors.rightMargin: 20
}

5.3 使用相對佈局:相對佈局的一個可能的好處是能夠依賴於指定元件的位置進行佈局,但是帶來的後果是在跨平臺上位置總是有時候會出現不一致的情況,然而在windows上卻表現的非常好,所以,應該儘量避免這種潛在bug,不然後面編譯的時候,頭疼,參考程式碼如下:

Rectangle {
    id: rect1
    x: 20
    width: 200; height: 200
}
Rectangle {
    id: rect2
    x: rect1.x
    y: rect1.y + rect1.height
    width: rect1.width - 20
    height: 200
}

注意: 5.2 和 5.3 兩種佈局都實現了兩個矩形的定位,但是,5.2的效率更高,在跨平臺上不會因為dpi的問題導致位置間距不一樣,切記。

5.4、功能板塊儘量進行分割槽域(分塊)進行佈局:建議將一個頁面進行劃分區域(Item),然後再進行佈局,避免內部佈局受外部佈局的影響,如圖所示:
在這裡插入圖片描述

大致的一些佈局關係就說到這裡,佈局的建議不一定完全適合所有情況,需要自己合理使用。
注意:針對於一些高解析度低尺寸的螢幕,需要根據dpi來進行相對位置的偏移。