目录
简述
1. JavaScript 类型
2. QML对JavaScript类型的扩展
2.1 提供全局对象和辅助方法
2.2 支持动态对象创建
2.3 增强的导入机制
2.4 严格的作用域和类型检查
2.5 与QML属性和信号的深度集成
2.6 支持异步编程
2.7 类型转换和数据绑定
3. JavaScript 资源导入
3.1 内联 JavaScript
3.2 外部 JavaScript 文件
4. JavaScript 表达式和属性绑定
总结
Qt Quick 作为 Qt 框架中构建现代用户界面的利器,其核心 QML 语言以其声明式语法和强大的数据绑定机制著称。然而,QML 本身并不足以应对所有复杂的逻辑处理,这时就需要 JavaScript 的加持。本文将深入探讨 QML对Javascript的类型扩展,以及如何在 Qt6 QML 中无缝集成 JavaScript。
QML 中的 JavaScript 引擎基于 ECMAScript 标准,支持大多数常见的 JavaScript 类型,包括:
QML引擎提供了一个特殊的JavaScript环境,其中包含一些全局对象和辅助方法,这些方法简化了与QML环境的交互。
例如,Qt对象提供了许多用于操作QML对象和执行特定任务的函数,如Qt.binding()用于动态绑定。
QML允许在JavaScript中动态创建QML对象。这可以通过Qt.createComponent()或Qt.createQmlObject()等函数实现。这种方式可以延迟对象的实例化,从而优化应用的启动时间和内存使用。
QML扩展了JavaScript的导入机制,允许开发者通过import语句将JavaScript文件作为模块导入到QML文件中。此外,QML还支持ECMAScript模块的导入语法,使得JavaScript代码可以更灵活地组织和重用。
与浏览器环境不同,QML的JavaScript环境更加严格。例如,QML不允许修改全局对象的成员,所有变量必须显式声明,否则会抛出异常。这种设计有助于避免意外的全局变量污染和类型错误。
JavaScript可以直接用于定义QML对象的属性绑定和信号处理。例如,属性绑定可以使用JavaScript表达式来描述QML对象属性之间的依赖关系。信号处理函数也可以直接用JavaScript编写,从而实现复杂的交互逻辑。
QML的JavaScript环境支持异步编程模式,包括Promise和async/await语法。这使得开发者可以更方便地处理异步操作,例如网络请求或定时任务。
QML提供了内置的类型转换器,可以将JavaScript对象(如数组或对象)转换为QML的模型(如ListModel)。这种转换使得JavaScript数据可以无缝地绑定到QML的UI组件中。
通过这些扩展,QML不仅保留了JavaScript的核心特性,还增强了其在构建用户界面和处理复杂逻辑时的能力。
在 QML 中使用 JavaScript 代码,可以通过以下两种方式导入:
直接在 QML 文件中使用JavaScript 代码:
import QtQuick
Window {
id: myWindow
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Rectangle {
id: rect
width: myWindow.width
height: myWindow.height
}
// 定义 JavaScript 函数
function changeColor() {
rect.color = "purple";
}
// 调用 JavaScript 函数
Component.onCompleted: {
changeColor();
}
}
其中js代码的作用就是将矩形变为紫色。
写一段js代码,用于生成随机颜色:
// utils.js
function getRandomColor() {
var letters = '0123456789ABCDEF';
var color = '#';
for (var i = 0; i < 6; i++) {
color += letters[Math.floor(Math.random() * 16)];
}
return color;
}
将 JavaScript 代码保存在单独的 utils.js 文件中。 修改工程CMakeLists文件,添加utils.js文件:
或者在source目录,右键添加现有文件:
然后在 QML 中使用 import 语句导入:
import QtQuick
import "utils.js" as Utils
Window {
id: myWindow
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Rectangle {
id: rect
width: myWindow.width
height: myWindow.height
color: Utils.getRandomColor() // 使用外部 JavaScript 函数
}
}
运行效果:
QML 支持在属性绑定中使用 JavaScript 表达式,这使得属性值可以根据其他属性或 JavaScript 表达式的计算结果动态更新。
import QtQuick
Window {
id: myWindow
width: 640
height: 480
visible: true
title: qsTr("Hello World")
Rectangle {
id: rect
width: myWindow.width
height: myWindow.height
color: mouseArea.containsMouse ? "red" : "blue" // 颜色根据鼠标悬停状态改变
}
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
}
}
该qml代码的意思是鼠标滑入Window时,矩形区域的颜色变为红色,滑出则变为蓝色。
JavaScript 为 QML 提供了强大的脚本能力,使其能够处理复杂的逻辑和动态行为。通过理解 JavaScript 类型、资源导入、表达式绑定等关键概念,您可以充分利用 JavaScript 的优势,构建更加灵活和强大的 Qt Quick 应用程序。