解讀QML之一
Qt QML模組提供了用於實現QML架構的C++類。用戶端可以使用這些類與QML運行時互動(例如:資料注入或調用對象的方法),並從QML檔案執行個體化一個對象的階層。Qt QML模組提供了許多的C++類,而並非僅僅是列在下面的類。然而列在下面的
類提供了QML運行時的基礎和QML的核心概念。
QML運行時
一個典型的QML應用程式有一個C++函數的進入點,該進入點是:執行個體化一個QQmlEngine並且使用QQmlComponent載入一個QML文檔。引擎(QQmlEngine對象)提供了一個預設的QQmlContext,這是一個頂級的上下文,用於執行定義在QML文檔中的方法和運算式。定義在QML文檔中的對象層次將會通過調用QQmlComponent執行個體化對象的create()方法被執行個體化。
用戶端可能需要通過注入屬性或者對象到上下文中修改引擎提供的預設QQmlContext。它們可以通過調用QQmlEngine::rootContext()方法來訪問頂級的上下文。
在執行個體化對象之後,用戶端通常就將控制權傳遞給應用程式的事件迴圈,以使得使用者輸入時間(例如滑鼠點擊)可以被應用程式分發和處理。
注意:Qt Quick模組提供了一個便利的類:QQuickView,該類提供了QML運行時,以及用於顯示QML應用的可視化視窗。
QQmlEngine類
QQmlEngine類提供了一個可以用於管理定義在QML文檔中對象整合層次的引擎。它提供了一個根QML上下文,運算式可以在該上下文中執行,並且可以確保在需要的時候可以正確的更新對象的屬性。
QQmlEngine允許一個全域的配置應用到被它管理的所有的對象上。例如:QNetworkAccessManager用於網路通訊,檔案路徑用於持久性的儲存。
可以查看QQmlEngine類文檔擷取更多資訊,並且瞭解到它如何被應用到應用程式中。
QQmlContext類
QQmlContext類為對象的執行個體化以及運算式的評估提供了一個上下文環境。所有的對象都在一個特定的上下文中執行個體化,並且應用程式運行中要執行的運算式都在一個特定的上下文中執行。這個上下文定義了符號是如何被解析的,以及運算式操作的值。
查看QQmlContext類文檔擷取更多的資訊,以及如何擷取一個對象的上下文。
動態對象執行個體化以及運算式的執行
動態對象的執行個體化以及動態運算式的計算都是QML的核心概念。QML文檔定義了可以在運行時通過QQmlComponent執行個體化的物件類型。一個QQmlComponent類的執行個體可以通過C++直接建立,或者是通過Qt.createComponent()方法在QML代碼中建立。屬性運算式可以在C++中通過QQmlExpression類計算,並且這些運算式可以直接在QML上下文中使用。
QQmlComponent類
QQmlComponent類可以用來載入QML文檔。它需要QQmlEngine來執行個體化定義在QML文檔中的對象層次。
查看QQmlComponent擷取更多的資訊,以及如何使用QQmlComponent。
QQmlExpression類
QQmlExpress類為用戶端提供了一種在C++中執行JavaScript運算式的方式,使用特定了QML計算上下文。這使得用戶端可以通過id訪問QML對象。返回的計算結果的類型是QVariant,並且轉換原則定義在QML引擎中。
查看QQmlExpression類文檔擷取更多的資訊,以及如何在應用程式中使用QQmlExpression。
QML的類型系統
在QML文檔中用於定義對象層次的類型無非來源於以下幾種:
*通過QML語言原生提供
*使用QML模組通過C++註冊
*QML模組提供的QML文檔
當然,應用程式開發人員也可以提供他們自己的類型:可以直接通過C++類型註冊,也可以在QML文檔中定義可重用的組件,然後匯入。
無論類型的定義來自哪裡,引擎都要求這些類型對屬性和執行個體都是型別安全的。
基本類型
QML語言有一些內建的原語類型,包括整型,雙精確度浮點型,字串類型以及布爾類型等。對象可以擁有這些類型的屬性,並且這些類型的值可以作為參數傳遞給對象的方法。
查看QML基本類型文檔擷取更多資訊。
QML支援一系列的基本類型。一個基本類型通常指的是一個簡單的值,例如一個int或者一個string。和QML物件類型做對比,QML物件類型通常指的是一個包含屬性,訊號和方法的對象。不同於物件類型,基本類型不能聲明QML對象:例如,不能聲明一個int{}對象或者一個size{}對象。
基本類型通常這麼使用:
*單個的值(例如:int指一個單個數字,var指條目列表)
*一個包含了一系列屬性-值對的值(例如:size值包含了width和height屬性的值)
一些基本類型是引擎預設支援的,使用它們不需要匯入聲明,然而其它的基本類型則需要匯入模組後才能使用。所有羅列在下面的類型都可以在QML文檔中作為屬性使用,除了:
*list必須和一個QML對象一起使用
*enumeration不能被直接使用,除非枚舉類型被一個註冊的QML物件類型定義
QML語言提供的基本類型
QML模組提供的基本類型
QML模組擴充QML語言提供更多的基本類型。例如:QtQuick模組提供的基本類型羅列如下:
目前,只有Qt提供的QML模組可以提供基本類型,但是這種局面在將來發布的QtQML可能會被改變:我們可以使用一個特定的QML模組提供的類型,用戶端只需要早QML文檔中匯入該模組。
一些基本的類型也擁有屬性,例如:font類型就具有pixelSize,family和b屬性。與物件類型的屬性不同的是,基本類型的屬性不提供它們自己屬性改變的訊號。因此,僅僅只能為基本類型的屬性建立屬性改變訊號的處理者。
基本類型的任一屬性改變,那麼屬性改變的訊號就會被發射,例如:
JavaScript類型
JavaScript對象和數組都被QML引擎支援。任何標準的JavaScript類型都可以使用通用的var類型建立和儲存。
例如,標準的Date和Array類型都是可使用的:
QML物件類型
QML物件類型就是那些可以執行個體化的QML對象。QML物件類型都是從QtObject繼承而來,並且通過QML模組提供。應用程式可以匯入這些模組繼而使用這些類型。QtQuick模組提供了大多數在QML中用於建立UI的類型。
每一個QML文檔都隱式的定義了一個QML物件類型,它可以在QML文檔中重用。
Rectangle就是一個物件類型:它可以被用來建立Rectangle類型的對象。
自訂的QML物件類型可以通過建立一個定義了該物件類型的.qml檔案來完成,或者是通過C++定義QML類型並將該類型註冊到QML引擎。
通過.qml檔案自訂QML類型舉例如下:
註:還可以通過Component定義匿名型別,如下:
通過C++定義QML類型舉例:略。