QML基礎——基本語法


QML 的基本語法
QML看起來像這樣

import Qt 4.7

Rectangle {
width: 200
height: 200
color: "blue"

Image {
source: "pics/logo.png"
anchors.centerIn: parent
}
}

對象是通過類型而直接被指定的,緊隨其后的是一對大括號。對象類型總是以大寫字母開頭。在上面的例子中,存在兩個對象Rectangle和Image。在大括號之間,我們可以指定對象的相關信息,例如它的屬性。屬性是通過“property: value”這樣的方式被呈現的。在上面的例子中,我們可以看到Image擁有一個屬性叫做source,它被分配了一個值叫做"pics/logo.png"。屬性和值被冒號分隔。

屬性可以被一行行指定:

Rectangle {
width: 100
height: 100
}

或單行輸寫多個屬性:

Rectangle { width: 100; height: 100 }

當單行輸寫多屬性/值時,必須由分號來分隔開來。

Import語句導入Qt模塊,它包含所有標准的QML元素。如果沒有Import語句;那么RectangleImage元素將無效。

表達式

除了賦值屬性外;你也可以用JavaScript編寫的表達式來指定。

Rotation {
angle: 360 * 3
}

這些表達式可以包含其它對象與屬性的引用,在這種情況下就會建立約束關聯:當該表達式改變值時;該屬性值將自動更新。

Item {
Text {
id: text1
text: "Hello World"
}
Text {
id: text2
text: text1.text
}
}

在上面的示例中,text2對象將顯示與text1相同的文本。如果text1改變值;那么text2也將自動更新為相同的值。

注意這里我們通過使用id值引用其它的對象。(詳情請參見id屬性信息)

QML注釋

QML中的注釋類似於JavaScript

單選注釋 // 開始

多行注釋 /* 開始,以 */ 結束。

import Qt 4.7

注釋是不被執行的,添加注釋可對代碼進行解釋或者提高其可讀性。

注釋同樣還可用於防止代碼執行,這對跟蹤問題是非常有用的。

Text {
text: "Hello world!"
//opacity: 0.5
}

在上面的示例中,這個Text對象將正常顯示,一旦opacity: 0.5這行關掉注釋,這是以半透明方式顯示文本。

屬性

屬性命名

屬性命名以首字母為小字(附加屬性除外)。

屬性類型

QML支持許多類型的屬性(參閱QML基本類型)。基本類型包括整型、實數型、布爾、字符串、顏色以及列表。

Item {
x: 10.5 // a 'real' property
...
state: "details" // a 'string' property
focus: true // a 'bool' property
}

QML屬性是有類型安全檢測的。也就是說,它們只允許你指定一個與屬性類型相匹配的值。例如,項目x屬性類型是實數,如果你賦值一個字符串;那么將會得到錯誤的信息。

Item {
x: “hello” // illegal!
}
id屬性

每個對象可給予一個特定唯一的屬性稱之為id。在同一個QML文件中不可能擁有與其它對象同名的id值。指定一個id可以允許該對象可以被其它的對象與腳本引用。

下面的示例中,第一個矩形元素的id名為”myRect。第二個矩形元素的寬度是引用的myRect.widtch,這意味着它將與第一矩形具有相同的width值。

Item {
Rectangle {
id: myRect
width: 100
height: 100
}
Rectangle {
width: myRect.width
height: 200
}
}

請注意,一個id首字符必須小寫字母或下划線並且不能包含字母,數字和下划線以外的字符

列表屬性

列表屬性類似於下面這樣:

Item {
children: [
Image {},
Text {}
]
}

列表包含在方括號內,以逗號分隔的列表元素。在你只分配單一項目列表情況可以省略方括號:

Image {
children: Rectangle {}
}
默認屬性

每個對象類型可以指定列表或對象屬性之一作為默認屬性。如果屬性已被聲明為默認屬性,該屬性標記可以省略。例如該代碼:

State {
changes: [
PropertyChanges {},
PropertyChanges {}
]
}

可以簡化成這樣:

State {
PropertyChanges {},
PropertyChanges {}
}

因為changesState類型的默認屬性。

分組屬性

在某些情況下使用一個‘.’符號或組符號形成一個邏輯組。

組屬性可寫以下這樣:

Text {
font.pixelSize: 12
font.bold: true
}

或者這樣:

Text {
font { pixelSize: 12; bold: true }
}

在元素文件組屬性使用.符號顯示。

附加屬性

有些對象的屬性附加到另一個對象。附加屬性的形式為Type.property其中Type附加property的類型

例如

Component {
id: myDelegate
Text {
text: "Hello"
color: ListView.isCurrentItem ? "red" : "blue"
}
}
ListView {
delegate: myDelegate
}

ListView元素附加ListView.isCurrentItem屬性到每個它創建的代理上。

另一個附加屬性的例子就是Keys元素,它用於處理任意可視項目上的按鍵,例如:

Item {
focus: true
Keys.onSelectPressed: console.log("Selected")
}
信號處理器

信號處理器允許響應事件時處理動作。例如,MouseArea元素有信號處理器來處理鼠標按下,釋放以及單擊:

MouseArea {
onPressed: console.log("mouse button pressed")
}

所有信號處理開始都是啟用的

一些信號處理一個可選的參數,例如MouseArea onPressed信號處理程序鼠標參數:

 MouseArea {
acceptedButtons: Qt.LeftButton | Qt.RightButton
onPressed: if (mouse.button == Qt.RightButton) console.log("Right mouse button pressed")
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM