Qt 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:
ScrollView {
horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
Flickable {
// ... } }
- 1
- 2
- 3
- 4
- 5
- 6
而替換成簡單的 ScrollBar/ScrollIndicator控件則可以被附加到任何的Flickable上:
Flickable {
// ... ScrollBar.vertical: ScrollBar { } }
- 1
- 2
- 3
- 4
Qt Quick Controls 2 API的目標是變得更簡單明了。常規的操作很簡單,而更復雜的操作則可以變成拷貝到你代碼中的文檔型代碼塊。
特性比照表
~ | Qt Quick Controls | Qt Quick Controls 2 |
---|---|---|
樣式化的delegates | Yes | Yes |
內建原生styles | Yes | No |
運行時style/theme切換 | Yes1 | Yes2 |
可用於Desktop | Yes | Yes |
可用於Mobile | Yes3 | Yes |
可用於Embedded | Yes3 | Yes |
內部事件處理 | QML | C++ |
1.非官方支持,但是技術上可以通過私有API實現
2.只有theme是可以在運行時切換的,而style則是固定的
3.性能上可能不是最好的
遷移Qt Quick Controls的代碼
Qt Quick Controls2的API跟Qt Quick Controls是十分相似的,但是其實際上為了改進,還是有些API被改變了。最多的改變就是樣式方面的改變;所有控件的delegate都可以通過控件自身訪問,而非通過分離的樣式對象。
舉個例子,要在Qt Quick Controls中設置Button的樣式:
Button {
style: ButtonStyle {
label: Label {
// ... } } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
而在Qt Quick Controls2中,則像下面這樣:
Button {
contentItem: Label {
// ... } }
- 1
- 2
- 3
- 4
- 5
准備遷移
遷移到 Qt Quick Controls 2的一個比較好的辦法是,將每個有自定義樣式的控件放到一個單獨的QML文件中。比如,上面Qt Quick Controls的button就可以移動到一個名為Button.qml的文件中,然后將這個文件放到一個名為controls的文件夾中,然后再按以下方式操作:
import "controls" as Controls Controls.Button { ... }
- 1
- 2
- 3
- 4
- 5
這樣的做法在新舊的模塊中都能用,並能減少遷移開始時的工作量。
類型對照表
第一列列出了在Qt Quick Controls 1, Qt Quick Dialogs, 和 Qt Quick Extras中所有可用的類型,第二列則是Qt Quick Controls 2中對應的類型。如果沒有直接替代方案,則第三列包含提供相關功能的備選方案。最后一列包含了在兩個模塊內的對應類型區別的說明。
Qt Quick Controls 1 | Qt Quick Controls 2 | 備選方案 | 備注 |
---|---|---|---|
Action | Action | Shortcut (Qt Quick) |
|
ApplicationWindow | ApplicationWindow | ||
BusyIndicator | BusyIndicator | ||
Button | Button | ||
Calendar | – | MonthGrid, DayOfWeekRow, WeekNumberColumn (Qt Labs Calendar) |
Qt Labs Calendar: MonthGrid, DayOfWeek, 和 WeekNumberColumn 屬於未風格化的calendar視圖 |
CheckBox | CheckBox | ||
ComboBox | ComboBox | ||
ExclusiveGroup | – | ActionGroup, ButtonGroup (Qt Quick Controls 2) |
Qt Quick Controls 2: ActionGroup 和 ButtonGroup 提供相似的功能 |
GroupBox | GroupBox | ||
Label | Label | ||
Menu | Menu | Menu (Qt Labs Platform) |
Qt Quick Controls 1: Menu是在Qt平台抽象層提供實現的平台上原生的。其他平台使用基於QML的頂級菜單彈出窗口。菜單支持傳統的桌面風格聯級子菜單,但是在嵌入式Linux上不管用,因為EGLFS不支持多個頂級窗口。 Qt Quick Controls 2: Menu是非原生、基於Item的,而是堆疊在應用程序內容之上的彈出窗口。因此,菜單彈出窗口被限制在窗口邊界內。Menu完全可由QML和Qt Quick定制樣式,並且可以允許添加任何的Item。傳統桌面的特性(如聯級子菜單和可視鍵盤快捷鍵)都不支持。 Qt Labs Platform: Menu是一個實驗性的本地菜單,在不支持Qt平台抽象層提供實現的平台上,它會fallback到Qt Widgets。 |
MenuBar | MenuBar | MenuBar (Qt Labs Platform) |
Qt Quick Controls 1: MenuBar是在Qt平台抽象層提供實現的平台上原生的。其他平台使用堆疊在窗口頂部的基於QML的菜單欄項目。 Qt Quick Controls 2: MenuBar是基於QML並可以完全使用QML和Qt Quick定制樣式的非原生menubar。 Qt Labs Platform: MenuBar是一個實驗性的原生menubar。它只能用於支持Qt平台抽象層原生實現的平台。 |
MenuItem, MenuSeparator |
MenuItem, MenuSeparator |
MenuItem, MenuSeparator (Qt Labs Platform) |
Qt Quick Controls 1: MenuItem 和 MenuSeparator在支持Qt平台抽象層實現的平台上是原生的。其他平台使用基於QML的menu item和separator。 Qt Quick Controls 2: MenuItem 和 MenuSeparator是基於QML並完全可用QML和Qt Quick定制樣式的非原生item。 Qt Labs Platform: MenuItem and MenuSeparator是實驗性的原生menu item和separator |
ProgressBar | ProgressBar | ||
RadioButton | RadioButton | ||
ScrollView | ScrollView | ||
Slider | Slider | ||
SpinBox | SpinBox | ||
SplitView | – | ||
StackView, StackViewDelegate, Stack |
StackView | Qt Quick Controls 2: StackView通過一個單獨的StackView類型提供可定制的轉換和附加屬性。 | |
StatusBar | – | ToolBar (Qt Quick Controls 2) |
Qt Quick Controls 2: ApplicationWindow允許分配任何的item或者控件比如ToolBar作為header或者footer。 |
Switch | Switch | ||
TabView, Tab |
– | TabBar, TabButton (Qt Quick Controls 2) |
Qt Quick Controls 2: TabBar 和 TabButton 提供了相似的函數,可以用來構建tabbed views。 |
TableView | – | ||
TextArea | TextArea | Qt Quick Controls 1: TextArea 繼承於ScrollView,因此它始終是個可滾動的editor。 Qt Quick Controls 2: TextArea 是一個可選擇性附加到Flickable以提供滾動功能的簡單多行editor。這就允許TextArea用於可滾動的頁面而不會出現嵌套的可滾動區域,解決了可用性問題。 |
|
TextField | TextField | ||
ToolBar | ToolBar | ||
ToolButton | ToolButton | ||
TreeView | – | ||
Qt Quick Dialogs | Qt Quick Controls 2 | 備選方案 | 備注 |
Dialog | – | Dialog | Qt Quick Dialogs: Dialog可以是一個頂層窗口或者是一個基於Item的彈出內容,這取決於所在的平台是否支持多個頂層窗口。 Qt Quick Controls 2: Dialog不是頂層窗口,而是堆疊在程序內容之上的基於Item的彈出內容,因此,dialog會被限制在窗口范圍內。 |
ColorDialog, FileDialog, FontDialog, MessageDialog |
– | ColorDialog, FileDialog, FolderDialog, FontDialog, MessageDialog (Qt Labs Platform) |
Qt Quick Dialogs: Dialog在支持Qt平台抽象層實現的平台上是原生的.其他平台上使用Qt Widgets或者基於QML的dialog,這取決與其所在的平台是否支持多個頂層窗口。 Qt Labs Platform: 實驗性的原生dialog,在不支持Qt平台抽象層實現的平台上,fallback到Qt Widgets。 |
Qt Quick Extras | Qt Quick Controls 2 | 備選方案 | 備注 |
CircularGauge | – | ||
DelayButton | DelayButton | ||
Dial | Dial | ||
Gauge | – | ||
Picture | – | ||
PieMenu | – | ||
StatusIndicator | – | ||
ToggleButton | – | ||
Tumbler, TumblerColumn |
Tumbler | Qt Quick Extras: Tumbler可以包含多列。 Qt Quick Controls 2: Tumbler代表一個單獨的滾輪。多列的可以由多個Tumbler排列在一起組成。 |
|
之前沒有的 | Qt Quick Controls 2 | 備選方案 | 備注 |
– | AbstractButton | ||
– | ActionGroup | ExclusiveGroup (Qt Quick Controls 1) |
Qt Quick Controls 1: ExclusiveGroup 提供類似功能 |
– | ButtonGroup | ExclusiveGroup (Qt Quick Controls 1) |
Qt Quick Controls 1: ExclusiveGroup 提供類似功能 |
– | CheckDelegate | ||
– | Container | ||
– | Control | ||
– | Drawer | ||
– | Frame | ||
– | ItemDelegate | ||
– | Page | ||
– | PageIndicator | ||
– | Pane | ||
– | Popup | ||
– | RadioDelegate | ||
– | RangeSlider | ||
– | RoundButton | ||
– | ScrollBar, ScrollIndicator |
ScrollView (Qt Quick Controls 1) |
Qt Quick Controls 1: ScrollView提供了類似的功能。它結合了水平跟豎直的scrollbar,還有環繞這scroll view的背景頁面。 |
– | – | StandardPaths (Qt Labs Platform) |
Qt Quick Dialogs: FileDialog提供了方便讀取大部分標准路徑的快捷屬性。 Qt Labs Platform: StandardPaths提供了獨立的類型以提供訪問標准路徑的方法。 |
– | SwipeDelegate | ||
– | SwipeView | ||
– | SwitchDelegate | ||
– | – | SystemTrayIcon (Qt Labs Platform) |
Qt Labs Platform: SystemTrayIcon 是一個實驗性的系統原生的system tray icon。在不支持Qt平台抽象層實現的平台上會fallback到Qt WIdgets。 |
– | TabBar, TabButton |
TabView (Qt Quick Controls 1) |
Qt Quick Controls 1: TabView提供了類似的方法。它由tab bar,背景和圍繞tab的頁面組成。 |
– | ToolSeparator | ||
– | ToolTip | Qt Quick Controls 1: Button 和 Action有內建的基於Qt Widgets的tooltips。 Qt Quick Controls 2: ToolTip可以附加到任何的Item上。 |
https://blog.csdn.net/MatchYang/article/details/79302172