天天看點

QML文法基礎簡述導入語句對象聲明子對象注釋

qml 是一種多範式語言,使對象能夠根據其屬性以及如何關聯和響應其他對象的更改來定義對象。與純粹的指令式代碼相反,屬性和行為的變化通過一系列逐漸處理的語句表達。qml 的聲明性文法将屬性和行為更改直接內建到單個對象的定義中,這些屬性定義可以包含必要的代碼,在情況複雜的自定義應用程式行為是必要的。

qml 源代碼通常由引擎通過 qml 文檔加載,qml 文檔是 qml 代碼的獨立文檔。這些可以用于定義 qml 對象類型,然後可以在整個應用程式中重複使用。

<a href="#%e7%ae%80%e8%bf%b0">簡述</a>

<a href="#%e5%af%bc%e5%85%a5%e8%af%ad%e5%8f%a5">導入語句</a>

<a href="#%e5%af%b9%e8%b1%a1%e5%a3%b0%e6%98%8e">對象聲明</a>

<a href="#%e5%ad%90%e5%af%b9%e8%b1%a1">子對象</a>

<a href="#%e6%b3%a8%e9%87%8a">注釋</a>

qml 文檔可以在檔案的頂部包含一個或多個 import 語句。一個 import 可以是以下任何一種:

一個已經注冊了類型的版本化命名空間(例如:通過插件)

一個包含 qml 文檔類型定義的相對目錄

一個 javascript 檔案

在導入時,javascript 檔案的導入必須是合格的,以便可以通路其提供的屬性和方法。

各種 import 的通用形式如下:

<code>import namespace versionmajor.versionminor</code>

<code>import namespace versionmajor.versionminor as singletontypeidentifier</code>

<code>import "directory"</code>

<code>import "file.js" as scriptidentifier</code>

例如:

<code>import qtquick 2.0</code>

<code>import qtquick.localstorage 2.0 as database</code>

<code>import "../privatecomponents"</code>

<code>import "somefile.js" as script</code>

在文法上,一個 qml 代碼塊定義了一個要被建立的 qml 對象樹。使用對象聲明來定義對象,對象聲明描述了要建立對象的類型以及要給予對象的屬性。每個對象也可以使用嵌套對象聲明來聲明子對象。

一個對象聲明包含:

對象類型的名稱(例如:rectangle )

一組花括号<code>{ }</code>: 緊随其(對象類型的名稱)後

屬性(例如:width)和子對象(例如:text):在花括号中聲明

來看一個簡單的對象聲明:

這聲明了一個類型為 rectangle 的對象(rectangle 類型由 qtquick 子產品提供),後跟一組包含為該對象定義屬性的花括号,定義的屬性是矩形的 width (寬度)、height(高度)和 color(顔色)。

如果上述對象是 qml 文檔的一部分,則可以由引擎加載。也就是說,如果源代碼用導入 qtquick 子產品的 import 語句來補充(使 rectangle 類型可用),如下所示:

當放置到 .qml 檔案中并由 qml 引擎加載時,上述代碼會使用 qtquick 子產品提供的 rectangle 類型建立一個 rectangle 對象:

QML文法基礎簡述導入語句對象聲明子對象注釋

注意:如果對象定義隻有少量的屬性,可以寫在單行,用分号分隔:

顯然,這個例子中聲明的 rectangle 對象很簡單,因為隻定義了幾個屬性值。為了建立更多有用的對象,對象聲明可以定義許多其他類型的屬性(在下一節中讨論)。另外,對象聲明還可以定義子對象,如下所述。

任何對象聲明都可以通過嵌套的對象聲明來定義子對象。通過這種方式,任何對象聲明隐式聲明了一個對象樹,可以包含任意數量的子對象。

例如,下面的 rectangle 對象聲明包含了一個 gradient 對象聲明,gradient 又包含了兩個 gradientstop 聲明:

當代碼被引擎加載時,會建立一個對象樹,在根處有一個 rectangle 對象;這個對象有一個 gradient 子對象,gradient 又有兩個 gradientstop 子對象。

QML文法基礎簡述導入語句對象聲明子對象注釋

然而,這是一個在 qml 對象樹的上下文中的父子關系,而不是在視覺場景的上下文中。在視覺場景中的父子關系的概念由來自 qtquick 子產品的 item 類型提供,qtquick 子產品是大多數 qml 類型的基本類型,因為大多數 qml 對象旨在可視化地呈現。

例如,rectangle 和 text 都是基于 item 的類型,而在下面,一個 text 對象已經被聲明為一個 rectangle 對象的可視化子對象:

QML文法基礎簡述導入語句對象聲明子對象注釋

在上述代碼中,當 text 對象引用它的 parent 值時,指的是它的視覺 parent,而不是對象樹中的 parent。在這種情況下,它們是一樣的:rectangle 對象既是 qml 對象樹,又是視覺場景的上下文中的 text 對象的 parent。然而,盡管可以修改 parent 屬性以更改視覺父對象,但是對象樹的上下文中的一個對象的父對象不能從 qml 更改。

(另外,請注意,text 對象已經被聲明了,而沒有指派給 rectangle 的屬性,這與将 gradient 對象指派給 rectangle 的 gradient 屬性的前面的例子不同,這是因為 item 的 children 屬性已經被設定為類型的預設屬性來啟用這個更友善的文法。)

在 qml 中,注釋的文法與 javascript 類似:

單行注釋:以 <code>//</code> 開頭,并在行尾結束。

多行注釋:以 <code>/*</code> 開頭,以 <code>*/</code> 結尾。

引擎在處理 qml 代碼時會忽略注釋。注釋的好處很多:

有助于解釋代碼以提高其可讀性,便于日後自己參考或者他人閱讀。

用于防止代碼執行,這有時對跟蹤問題非常有用。

這時,text 對象将具有正常的透明度,因為行 <code>opacity: 0.5</code> 已經被注釋掉了。

QML文法基礎簡述導入語句對象聲明子對象注釋
項目驗收時,序猿示範功能,猛戳按鈕愣是沒反應。。。悶頭走向工位,打開源碼,發現了神奇的 <code>// todo</code>

繼續閱讀