QML文檔
QML文檔是用QML文法組成的字串。一個文檔定義了一個QML物件類型。文檔以”.qml”最為尾碼,可以儲存在本地和網路上,可以使用代碼產生。一個在文檔中定義的物件類型的執行個體,也可以使用Component在QML代碼中建立,或者是在C++中使用QQmlComponent建立。一旦某一個物件類型明確的在QML對象系統中使用特定的名稱註冊了,那麼該類型就可以在其它的文檔中
直接用來聲明對象了。在文檔中定義可重用的QML物件類型對於允許用戶端編寫模組來說是十分重要的,也是的代碼高度可讀和
更加可維護。
QML文檔的結構
QML文檔由兩個部分組成:匯入部分,對象聲明部分。文檔中的匯入部分包含了匯入描述,定義了文檔中可使用的QML對象
類型和JavaScript資源。對象聲明部分定義了對象樹,當執行個體化定義在文檔中的物件類型的時候,對象樹就會被建立。
一個簡單的文檔樣本如下:
在匯入部分和對象聲明部分之間用一個空行隔開。QML文檔通常使用UTF-8編碼。
匯入
一個文檔必須匯入必要的模組或者是對象命名空間來確保引擎可以載入文檔中聲明的QML物件類型。預設情況下,QML文檔
可以訪問同目錄下的.qml檔案定義的任何QML物件類型。如果一個文檔需要訪問其他的物件類型,那麼它必須匯入該對象的命名空間。
不像C或者C++,在QML引擎載入文檔之前,QML沒有使用前置處理器對文檔做任何預先處理。Import聲明不會拷貝並呈現其代碼在文檔內,而是指示QML如何解析這些物件類型。任何出現在QML文檔中的類型——包括Rectangle和ListView——構成一個JavaScript塊或者是屬性綁定,都是基於匯入聲明來解析的。至少有一個import聲明是需要的:import QtQuick2.0.
根對象聲明
一個QML文檔描述了一個可以被執行個體化的對象層次。每一個對象定義都包含一定的結構:對象有一個類型,有一個id,並且有一個對象名,它也可以包含屬性,包含方法、訊號以及訊號處理控制代碼。
一個QML文檔必須只能包含一個單一的根對象定義。下面的文檔就是非法的,將會產生錯誤:
這是因為一個.qml檔案自動定義了一個QML類型,該類型封裝了單個QML對象的定義。
QML語言的文法
對象聲明部分必須使用合適的QML文法指定合法的對象。一個對象的聲明可能包含自訂對象屬性地熱指定。對象方法屬性的指定可以類似於JavaScript方法,對象屬性可以使用屬性綁定運算式指定。
可以查看QML文法擷取更多資訊,也可以查看整合QML和JavaScript擷取更多資訊。
通過QML文檔定義物件類型
在前面我們簡單的表述了如何在一個QML文檔中定義一個QML物件類型。QML的核心原則是可以定義可重用的物件類型。這提高了QML代碼的可維護性,增加了代碼層次聲明的可讀性,提高了UI介面定義和邏輯實現的分離性。
在下面的例子中,用戶端開發人員在文檔中定義了人Button類型:
Button類型可以在應用程式中如下使用:
資源載入和網路傳輸
QML是網路可傳輸的。應用程式可以像匯入本地路徑那樣匯入遠端路徑上的文檔。實際上任何url屬性都可以被指定為本地或者是遠端的URL,並且QML引擎會自動處理任何與網路通訊相關的內容。
QML通過使用URLs(而不是檔案名稱)來擷取QML文檔中引用的內容以支援網路傳輸。這意味著任何URL資源都是可以的,QML可以像處理本地資源那樣處理遠端資源。例如:
因為相對的URL跟相對的檔案是相同的可以使用如下簡單運算式代替上面的:
在整個QML中,網路傳輸都是被支援的,例如:
*Fonts——FontLoader的source屬性是一個URL;
*WebViews——WebView的url屬性;
甚至是QML類型本身也是在網路上的——如果qmlscence被用來載入http://example.com/mystuff/Hello.qml並且該檔案引用了一個”World”類型,那麼引擎就會載入http://example.com/mystuff/qmldir並且類似本地檔案一樣解析該類型例如:如果qmldir檔案包含行”World
World.qml”,那麼引擎就會載入http://example.com/mystuff/World.qml檔案。在Hello.qml檔案中通過相對URL引用的其它資源也會以類似的方式從網路上載入。
相對和絕對URL
這裡只需要記住一點:當使用的是絕對URL,那麼QML不會做任何處理,直接使用,如果使用的是相對的URL,那麼QML會轉換為絕對URL再使用。
QRC資源
URL文法的運算式在Qt中內建為”qrc”文法。這允許應用程式使用Qt資源系統將這些內容編譯到可執行檔中。使用QRC資源,可以將QML文檔編譯到可執行程式中。
這個時候可以使用相對URL,這個時候也不需要傳輸,因為qml內容直接編譯到可執行程式中。
限制
只有在import聲明中使用了”as”運算式才會引起網路傳輸。
更多細節:
*import “dir” 只在本地檔案系統起作用
*importlibraryUri 只在本地檔案系統起作用
*import “dir” asD 可以在網路傳輸中使用
*importlibraryuri as U 可以在網路傳輸中使用
應用程式安全的意義
QML安全模型就是QML內容是可信賴的:使用者安裝QML內容就像他們安裝原生Qt應用程式,或者是那些使用運行時編寫的程式例如Python和Perl。這個信任是建立在一系列的機制之上,包括在某些平台上使用的包的簽名機制。
為了儲存使用者的信任,QML應用程式開發人員不能載入和執行任意的JavaScript或者QML資源。例如:下面的QML代碼:
這等同於下載並且執行http://evil.com/evil.exe。QML引擎將不會阻止特定的資源下載。不像JavaScript代碼在瀏覽器中執行,QML應用程式可以像其它應用程式一樣以同樣的方式載入本地和遠端的資源。因此應用程式開發人員必須足夠的小心載入和執行任
何內容。對於應用程式訪問超出其控制權的內容,QML必須對它載入的資料加以校正。例如,不要使用import,Loader或者XMLHttpRequest來載入任何不可靠的代碼或內容。
命名空間和名稱解析
文檔中的運算式大部分是調用對象或者是對象的屬性,由於可能會定義多個對象並且不同的對象的不同屬性有著相同的名字,QML中必須預定義一些符號解析的文法。這一部分可以參見命名空間和符號解析。