Qt 5.12--Qt QML語法
1 簡介
QML是用於創建高度動態應用程序的多範式語言。 使用QML,可以聲明應用程序構建塊(如UI組件),並設置各種屬性來定義應用程序行爲。 可以通過JavaScript(該語言的子集)進一步編寫應用程序行爲腳本。 此外,QML大量使用Qt,Qt允許直接從QML應用程序訪問類型和其他Qt功能。
2 基本語法
2.1 Import 說明
導入語句允許客戶端告訴引擎QML文檔中使用了哪些模塊,JavaScript資源和組件目錄。 文檔中可以使用的類型取決於文檔導入的模塊,資源和目錄。
QML定義了 3 種不同的導入類型
2.1.1 模塊(命名空間)導入
最常見的導入類型是模塊導入。 客戶端可以導入QML模塊,這些模塊將QML對象類型和JavaScript資源註冊到給定的名稱空間中。
模塊導入的通用形式如下:
import <ModuleIdentifier> <Version.Number> [as <Qualifier>]
example:
import QtQuick 2.0
該導入允許使用QtQuick模塊提供的所有類型,而無需指定限定符。
import QtQuick 2.0
Rectangle {
width: 200
height: 100
color: "red"
}
爲了避免不同模塊之間的命名衝突,我們在導入模塊時可以使用“as”關鍵字設置該模塊在本 qml 文件中的“別名”。
import QtQuick 2.0 as Quick
Quick.Rectangle {
width: 200
height: 100
color: "red"
}
如果要求使用兩個具有相同名稱但位於不同模塊中的QML類型,則使用命名空間導入非常有用。 在這種情況下,可以將兩個模塊導入不同的名稱空間,以確保代碼引用正確的類型:
import QtQuick 2.0 as CoreItems
import "../textwidgets" as MyModule
CoreItems.Rectangle {
width: 100; height: 100
MyModule.Text { text: "Hello from my custom text item!" }
CoreItems.Text { text: "Hello from Qt Quick!" }
}
將多個模塊導入全局命名空間的方式與將多個模塊導入同一命名空間的方式相同。
import QtQuick 2.0 as Project
import QtMultimedia 5.0 as Project
Project.Rectangle {
width: 100; height: 50
Project.Audio {
source: "music.wav"
autoPlay: true
}
}
2.1.2 目錄導入
包含QML文檔的目錄也可以直接導入QML文檔中。 這爲將QML類型劃分爲可重用的分組提供了一種簡單的方法:
import "<DirectoryPath>" [as <Qualifier>]
2.1.3 JavaScript資源導入
2.1.4 別名("as"規則說明)
爲了避免不同模塊之間的命名衝突,我們在導入模塊時可以使用“as”關鍵字設置該模塊在本 qml 文件中的“別名”。
爲了保證 Qt 內部組件和命名空間不被污染以及保持代碼可以順利升級–比如升級 Qt 版本,需要確保不對 Qt 模塊設置別名,而對其他,比如HUI、Roshan以及其他三方的或者項目內的模塊,進行“別名”處理。尤其是那些對常見控件進行定製的模塊。
- 導入Qt內置模塊的版本號爲對應的Qt版本的最高版本號。
- js文件導入到qml中必須要有別名。
- 在導入模塊中,本身就有命名衝突時,需給其中至少一個模塊都設置別名
- 不對 Qt 內置模塊設置別名
- 對於自定義模塊需設置別名
- 別名作爲模塊在所屬 qml 文件中的代號,需保持文件內的唯一性
- 別名的命名規則採用“大駝峯”
2.1.5 非模塊命名空間導入
類型也可以直接通過C ++中的各種註冊函數(例如qmlRegisterType())註冊到名稱空間中。 可以通過導入名稱空間來導入已以此方式註冊到名稱空間中的類型,就好像該名稱空間是模塊標識符一樣。
int qmlRegisterType()
這是一個重載功能。
該模板函數在QML系統中註冊C ++類型。 無法從QML系統創建此類型的實例。
當不按名稱引用類型時,應使用此函數。 具體來說,它必須用於用作屬性綁定左側的C ++類型。
3 QML對象屬性
參考
1、The QML Reference
2、Quick–簡介
3、qml編碼規範與指導
4、qmlRegisterType
5、