本文档包含了我们在文档和示例中遵循的QML编码约定,并建议其他人遵循这些约定。
QML Object声明
在我们的文档和示例中,QML对象属性总是按照以下顺序结构:
> id
> 属性声明
> 信号声明
> JavaScript
> 对象属性
> 子对象
> 状态
> 变换
为了更好的可读性,我们用一个空行分隔这些不同的部分。
例如,一个假设的照片QML对象看起来像这样:
Rectangle { id: photo // id on the first line makes it easy to find an object property bool thumbnail: false // property declarations property alias image: photoImage.source signal clicked // signal declarations function doSomething(x) // javascript functions { return x + photoImage.width } color: "gray" // object properties x: 20 // try to group related properties together y: 20 height: 150 width: { // large bindings if (photoImage.width > 200) { photoImage.width; } else { 200; } } Rectangle { // child objects id: border anchors.centerIn: parent; color: "white" Image { id: photoImage anchors.centerIn: parent } } states: State { // states name: "selected" PropertyChanges { target: border; color: "red" } } transitions: Transition { // transitions from: "" to: "selected" ColorAnimation { target: border; duration: 200 } } }
组属性
如果使用一组属性中的多个属性,考虑使用组表示法而不是点表示法,这样可以提高可读性。
例如:
Rectangle { anchors.left: parent.left; anchors.top: parent.top; anchors.right: parent.right; anchors.leftMargin: 20 } Text { text: "hello" font.bold: true; font.italic: true; font.pixelSize: 20; font.capitalization: Font.AllUppercase }
也可以写成这样:
Rectangle { anchors { left: parent.left; top: parent.top; right: parent.right; leftMargin: 20 } } Text { text: "hello" font { bold: true; italic: true; pixelSize: 20; capitalization: Font.AllUppercase } }
列表
如果一个列表只包含一个元素,我们通常省略方括号。
例如,组件通常只有一个状态。
在这种情况下,
states: [ State { name: "open" PropertyChanges { target: container; width: 200 } } ]
可以写成这样:
states: State { name: "open" PropertyChanges { target: container; width: 200 } }
JavaScript代码
如果脚本是单个表达式,我们建议将其内联编写:
Rectangle { color: "blue"; width: parent.width / 3 }
如果脚本只有几行,我们通常使用块:
Rectangle { color: "blue" width: { var w = parent.width / 3 console.debug(w) return w } }
如果脚本的长度超过几行或者可以被不同的对象使用,我们建议创建一个函数并像这样调用它:
function calculateWidth(object) { var w = object.width / 3 // ... // more javascript code // ... console.debug(w) return w } Rectangle { color: "blue"; width: calculateWidth(parent) }
对于长脚本,我们将把函数放到它们自己的JavaScript文件中,并像这样导入:
import "myscript.js" as Script Rectangle { color: "blue"; width: Script.calculateWidth(parent) }
如果代码长于一行,因此在一个块中,我们使用分号来表示每条语句的结尾:
MouseArea { anchors.fill: parent onClicked: { var scenePos = mapToItem(null, mouseX, mouseY); console.log("MouseArea was clicked at scene pos " + scenePos); } }