QML编码规范#
代码风格规范
本文档包含了我们在文档和示例中遵循的QML编码规范,并推荐其他人遵循。
QML对象声明#
在文档和示例中,QML对象属性总是按照以下顺序组织
id
属性声明
信号声明
JavaScript函数
对象属性
子对象
为了提高可读性,我们用空行分隔这些不同部分。
例如,一个假设的photo 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; } } states: [ State { name: "selected" PropertyChanges { target: border; color: "red" } } ] transitions: [ Transition { from: "" to: "selected" ColorAnimation { target: border; duration: 200 } } ] Rectangle { // child objects id: border anchors.centerIn: parent color: "white" Image { id: photoImage anchors.centerIn: parent } } }
分组属性#
在从一组属性中使用多个属性时,如果它能提高可读性,建议使用分组表示法而不是点表示法。
例如,这样
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 } }
无限定访问#
为了提高可读性和性能,应显式通过ID引用父组件的属性
Item { id: root property int rectangleWidth: 50 Rectangle { width: root.rectangleWidth } }
必选属性#
当需要外部定义的数据时,通过使用必选属性 来明确指出。必选属性必须设置,否则组件创建将失败。与无限定查找相比,它们具有较高的性能,并允许用户和工具推理外部属性的类型。此外,它们还去除了组件必须对创建它们的环境做出的假设。
信号处理器#
在信号处理器中处理参数时,使用显式命名函数
MouseArea { onClicked: event => { console.log(`${event.x},${event.y}`); } }
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 : Item) : double { 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: event => { var scenePos = mapToItem(null, event.x, event.y); console.log("MouseArea was clicked at scene pos " + scenePos); } }