Qt Quick Controls有1和2兩個版本,在程序中會看到好多1和2版本混合使用的情況。
原文:https://doc.qt.io/qt-5/qtquickcontrols2-differences.html
參考:QtQuick.Controls 2與 QtQuick.Controls的區別和使用
Quick Controls 原本是為支持桌面平台而開發的,后來又加入了移動平台和嵌入式平台的支持。它們應用非常廣泛,因為它們提供了足夠靈活的樣式系統,以允許開發具有平台相關或者無關風格的應用程序。
在嵌入式系統中,由於硬件資源有限,這套系統可能是比較低效率的。而Qt Quick Controls 2正是為解決這樣的問題而生的,可以使用基准測試來指導開發。
C++和QML
在許多情況下,C++對內部狀態的處理會更加的高效。例如,對比C++處理events的過程,controls需要創建內部的MouseAreas並綁定Keys對象。
樣式
不僅是在C++中處理事件和邏輯能提高性能,這還允許可視化的QML層成為更簡單的聲明式層。這反映在controls項目的結構上:所有可視化實現都位於imports文件夾中,這樣,想要創建自己完整樣式的用戶就可以復制該文件夾並開始調整。看這里以了解更多關於樣式插件的實現。
在Qt Quick Controls 2中,樣式不再提供由controls實例化的組件(components),而是controls們包含可以被替代的item delegates。事實上,這代表delegates是現場實例化的Qt Quick item並且作為control的屬性,然后再簡單地把control作為父節點關聯起來。
模塊化和簡單化
在遇到復雜地controls的情況下,有時候把它們分開成不同的塊會更好一些。比如,一個復雜的ScrollView control:
1
2 3 4 5 6 |
ScrollView {
horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff Flickable { // ... } } |
而替換成簡單的 ScrollBar/ScrollIndicator控件則可以被附加到任何的Flickable上:
1
2 3 4 |
Flickable {
// ... ScrollBar.vertical: ScrollBar { } } |
Qt Quick Controls 2 API的目標是變得更簡單明了。常規的操作很簡單,而更復雜的操作則可以變成拷貝到你代碼中的文檔型代碼塊。
1.非官方支持,但是技術上可以通過私有API實現
2.只有theme是可以在運行時切換的,而style則是固定的
3.性能上可能不是最好的
遷移Qt Quick Controls的代碼
Qt Quick Controls2的API跟Qt Quick Controls是十分相似的,但是其實際上為了改進,還是有些API被改變了。最多的改變就是樣式方面的改變;所有控件的delegate都可以通過控件自身訪問,而非通過分離的樣式對象。
舉個例子,要在Qt Quick Controls中設置Button的樣式:
1
2 3 4 5 6 7 |
Button {
style: ButtonStyle { label: Label { // ... } } } |
而在Qt Quick Controls2中,則像下面這樣:
1
2 3 4 5 |
Button {
contentItem: Label { // ... } } |
准備遷移
遷移到 Qt Quick Controls 2的一個比較好的辦法是,將每個有自定義樣式的控件放到一個單獨的QML文件中。比如,上面Qt Quick Controls的button就可以移動到一個名為Button.qml的文件中,然后將這個文件放到一個名為controls的文件夾中,然后再按以下方式操作:
1
2 3 4 |
import
"controls"
as Controls Controls.Button { ... } |
類型對照表
第一列列出了在Qt Quick Controls 1, Qt Quick Dialogs, 和 Qt Quick Extras中所有可用的類型,第二列則是Qt Quick Controls 2中對應的類型。如果沒有直接替代方案,則第三列包含提供相關功能的備選方案。最后一列包含了在兩個模塊內的對應類型區別的說明。