QML提供了专门用于编写QML应用程序的JavaScript主机环境。此环境不同于浏览器或服务器端JavaScript环境(例如Node.js)提供的主机环境。例如,QML不提供window对象或DOM API在浏览器环境中常见的对象。
共同基础
类似于浏览器或服务器端JavaScript环境,QML运行时实现了ECMAScript语言规范标准。这提供对标准定义的所有内置类型和函数的访问,例如Object,Array和Math。QML运行时实现了该标准的第七版。
QML文档中未明确记录标准的ECMAScript内置插件。有关其用法的更多信息,请参考ECMA-262第7版标准或许多在线JavaScript参考和教程站点之一,例如W3Schools JavaScript参考(" JavaScript对象参考"部分)。许多站点专注于浏览器中的JavaScript,因此在某些情况下,您可能需要仔细检查规范以确定给定的函数或对象是标准ECMAScript的一部分还是特定于浏览器环境的。对于上面的W3Schools链接,此JavaScript Objects Reference部分通常涵盖标准,而Browser Objects Reference和HTML DOM Objects Reference部分则特定于浏览器(因此不适用于QML)。
QML全局对象
QML JavaScript主机环境实现了许多主机对象和功能,如QML全局对象文档中所述。
这些主机对象和功能始终可用,无论是否已导入任何模块。
· Qt对象:此对象是特定于QML,并提供辅助的方法和属性特定于QML环境。
· qsTr(),qsTranslate(),qsTrId(),QT_TR_NOOP(),QT_TRANSLATE_NOOP()和QT_TRID_NOOP()函数:这些函数特定于QML,并为QML环境提供转换功能。
· gc()函数:该函数特定于QML,并提供了一种手动触发垃圾收集的方法。
· print()函数:此函数特定于QML,并提供一种将信息输出到控制台的简单方法。
· console对象:这个对象实现的一个子集萤火控制台API。
· XMLHttpRequest,DOMException:这些对象实现W3C XMLHttpRequest规范的子集。
注:该globalObject()函数不能用于修改的全局对象QQmlEngine。
XMLHttpRequest:所述的XMLHttpRequest对象,其可用于异步从通过网络获得数据。
在XMLHttpRequest的 API实现相同的W3C标准为许多流行的网络浏览器,但下列情况除外:QML的XMLHttpRequest不执行相同的原始策略。
此外,responseXMLQML当前支持的XML DOM树是Web浏览器支持的DOM Level 3核心 API 的简化子集。QML实现支持以下对象和属性:
JavaScript对象和函数
QML引擎支持的JavaScript对象,函数和属性的列表可以在JavaScript对象和函数列表中找到。
请注意,QML对本机对象进行了以下修改:
· 将arg()函数添加到String原型。
· 支持区域设置的转换功能已添加到" 日期"和" 数字"原型中。
此外,QML还扩展了instanceof函数的行为,以允许针对QML类型进行类型检查。这意味着您可以使用它来验证变量确实是您期望的类型,例如:
var v = something();if (!v instanceof Item) {throw new TypeError("I need an Item type!");}...
JavaScript环境限制
QML对JavaScript代码实施以下限制:
· 写入.qml文件中的JavaScript代码无法修改全局对象。.js文件中的JavaScript代码可以修改全局对象,并且导入时这些修改对.qml文件可见。
在QML中,全局对象是常量-无法修改或删除现有属性,也不能创建任何新属性。
大多数JavaScript程序并非故意修改全局对象。但是,JavaScript自动创建未声明的变量是对全局对象的隐式修改,并且在QML中被禁止。
假设该a变量在作用域链中不存在,则以下代码在QML中是非法的:
// Illegal modification of undeclared variablea = 1;for (var ii = 1; ii < 10; ++ii)a = a * ii;console.log("Result: " + a);
可以对该合法代码进行微不足道的修改。
var a = 1;for (var ii = 1; ii < 10; ++ii)a = a * ii;console.log("Result: " + a);
任何隐式或显式修改全局对象的尝试都将导致异常。如果未捕获,将导致打印警告,其中包括违规代码的文件和行号。
· 全局代码在缩小的范围内运行。
在启动过程中,如果QML文件包含带有"全局"代码的外部JavaScript文件,则会在仅包含外部文件本身和全局对象的作用域中执行该文件。也就是说,它将无法正常访问QML对象和属性。
允许仅访问脚本局部变量的全局代码。这是有效的全局代码的示例。
var colors = [ "red", "blue", "green", "orange", "purple" ];
访问QML对象的全局代码将无法正确运行。
// Invalid global code - the "rootObject" variable is undefinedvar initialPosition = { rootObject.x, rootObject.y }
由于尚未完全建立QML环境,因此存在此限制。要在环境设置完成后运行代码,请参阅" 应用程序启动代码"中的JavaScript。
this在大多数情况下,QML中的值均未定义。
this从JavaScript绑定属性时支持该关键字。在QML绑定表达式中,QML信号处理程序和QML声明的函数this引用范围对象。在所有其他情况下,thisQML中未定义的值。
要引用特定对象,请提供id。例如:
Item {width: 200; height: 100function mouseAreaClicked(area) {console.log("Clicked in area at: " + area.x + ", " + area.y);}// This will pass area to the functionMouseArea {id: areay: 50; height: 50; width: 200onClicked: mouseAreaClicked(area)}}