QML教程(七) JavaScript

目录

一、对属性值使用 JavaScript 表达式

二、在 QML 中添加 JavaScript 函数

三、使用 JavaScript 文件

四、属性绑定中的 JavaScript

五、信号处理程序中的 JavaScript

六、将信号连接到 JavaScript 函数

七、启动执行 JavaScript


QML 提供的 JavaScript 主机环境可以运行有效的标准 JavaScript表达式,例如条件运算符、数组、变量设置和循环。除了标准的 JavaScript 属性之外,QML 全局对象还包括许多帮助程序方法,这些方法简化了构建 UI 和与 QML 环境的交互。

QML提供的JavaScript环境比Web浏览器中的环境更严格。例如,在 QML 中,您不能添加或修改 JavaScript 全局对象的成员。在常规 JavaScript 中,可以通过使用变量而不声明它来意外执行此操作。在 QML 中,这将引发异常,因此必须显式声明所有局部变量。请参阅 JavaScript 环境限制,了解从 QML 执行的 JavaScript 代码限制的完整描述。JavaScript 主机环境|Qt QML 6.4.1icon-default.png?t=MBR7https://doc.qt.io/qt-6/qtqml-javascript-hostenvironment.html#javascript-environment-restrictions

QML文档的各个部分可以包含JavaScript代码:

属性绑定的主体。这些 JavaScript 表达式描述了 QML 对象属性之间的关系。当属性的依赖项更改时,该属性也会根据指定的关系自动更新。
信号处理程序的主体。每当 QML 对象发出相关信号时,都会自动计算这些 JavaScript 语句。
自定义方法的定义。在 QML 对象主体中定义的 JavaScript 函数成为该对象的方法。
独立的 JavaScript 资源 (.js) 文件。这些文件实际上与 QML 文档是分开的,但它们可以导入到 QML 文档中。导入文件中定义的函数和变量可用于属性绑定、信号处理程序和自定义方法。

 

一、对属性值使用 JavaScript 表达式

Item {
    width: Math.random()
    height: width < 100 ? 100 : (width + 50) /  2
}

二、在 QML 中添加 JavaScript 函数

import QtQuick

Item {
    id: container
    width: 320
    height: 480

    function randomNumber() {
        return Math.random() * 360;
    }

    function getNumber() {
        return container.randomNumber();
    }

    TapHandler {
        // This line uses the JS function from the item
        onTapped: rectangle.rotation = container.getNumber();
    }

    Rectangle {
        color: "#272822"
        width: 320
        height: 480
    }

    Rectangle {
        id: rectangle
        anchors.centerIn: parent
        width: 160
        height: 160
        color: "green"
        Behavior on rotation { RotationAnimation { direction: RotationAnimation.Clockwise } }
    }

}

三、使用 JavaScript 文件

// myscript.js
function getRandom(previousValue) {
    return Math.floor(previousValue + Math.random() * 90) % 360;
}
import QtQuick
import "myscript.js" as Logic

Item {
    width: 320
    height: 480

    Rectangle {
        color: "#272822"
        width: 320
        height: 480
    }

    TapHandler {
        // This line uses the JS function from the separate JS file
        onTapped: rectangle.rotation = Logic.getRandom(rectangle.rotation);
    }

    Rectangle {
        id: rectangle
        anchors.centerIn: parent
        width: 160
        height: 160
        color: "green"
        Behavior on rotation { RotationAnimation { direction: RotationAnimation.Clockwise } }
    }

}

四、属性绑定中的 JavaScript

import QtQuick 2.12

Rectangle {
    id: colorbutton
    width: 200; height: 80;

    color: inputHandler.pressed ? "steelblue" : "lightsteelblue"

    TapHandler {
        id: inputHandler
    }
}

任何 JavaScript 表达式(无论多么复杂)都可以在属性绑定定义中使用,只要表达式的结果是其类型可以分配给属性的值。但是,不建议使用复杂的绑定和副作用,因为它们会降低代码的性能、可读性和可维护性。

有两种方法可以定义属性绑定:最常见的方法在前面的示例中的属性初始化中显示。第二种(也是更罕见的)方法是从命令式 JavaScript 代码中为属性分配一个从 Qt.binding() 函数返回的函数,如下所示:

import QtQuick 2.12

Rectangle {
    id: colorbutton
    width: 200; height: 80;

    color: "red"

    TapHandler {
        id: inputHandler
    }

    Component.onCompleted: {
        color = Qt.binding(function() { return inputHandler.pressed ? "steelblue" : "lightsteelblue" });
    }
}

五、信号处理程序中的 JavaScript

QML 对象类型可以发出信号以响应发生的某些事件。这些信号可以由信号处理程序函数处理,客户端可以定义这些函数以实现自定义程序逻辑。

假设由矩形类型表示的按钮具有 TapHandler 和文本标签。当用户按下按钮时,点击处理程序会发出其点击信号。客户端可以使用 JavaScript 表达式对处理程序中的信号做出反应。QML 引擎根据需要执行处理程序中定义的这些 JavaScript 表达式。通常,信号处理程序绑定到 JavaScript 表达式以启动其他事件或分配属性值。

import QtQuick 2.12

Rectangle {
    id: button
    width: 200; height: 80; color: "lightsteelblue"

    TapHandler {
        id: inputHandler
        onTapped: {
            // arbitrary JavaScript expression
            console.log("Tapped!")
        }
    }

    Text {
        id: label
        anchors.centerIn: parent
        text: inputHandler.pressed ? "Pressed!" : "Press here!"
    }
}

六、将信号连接到 JavaScript 函数

发出信号的 QML 对象类型还为其信号提供默认信号处理程序。但是,有时客户端希望在另一个 QML 对象发出信号时触发在 QML 对象中定义的函数。这种情况可以通过信号连接来处理。QML 对象发出的信号可以通过调用信号的方法并将 JavaScript 函数作为参数传递来连接到 JavaScript 函数。例

// script.js

function jsFunction() {
    console.log("Called JavaScript function!")
}
import QtQuick 2.12
import "script.js" as MyScript

Item {
    id: item
    width: 200; height: 200

    TapHandler {
        id: inputHandler
    }

    Component.onCompleted: {
        inputHandler.tapped.connect(MyScript.jsFunction)
    }
}

七、启动执行 JavaScript

有时需要在应用程序(或组件实例)启动时运行一些命令性代码。虽然将启动脚本作为全局代码包含在外部脚本文件中很诱人,但由于 QML 环境可能尚未完全建立,这可能会有严重的限制。例如,某些对象可能尚未创建,或者某些属性绑定可能尚未建立。

QML 对象在其实例化完成时发出附加的信号。相应处理程序中的 JavaScript 代码在对象实例化后运行。因此,编写应用程序启动代码的最佳位置是顶级对象的处理程序,因为此对象在完全建立 QML 环境时发出。

import QtQuick 2.0

Rectangle {
    function startupFunction() {
        // ... startup code
    }

    Component.onCompleted: startupFunction();
}

QML 文件中的任何对象(包括嵌套对象和嵌套的 QML 组件实例)都可以使用此附加属性。如果在启动时要执行多个处理程序,则它们将按未定义的顺序顺序运行。onCompleted()

同样,每个在被摧毁之前都会发出一个 destruction() 信号

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: QML是一种用户界面定义语言,用于快速和轻松地创建跨平台的应用程序界面。与传统的图形对话框编程不同,QML通过使用声明性语法和元素组件来描述应用程序的图形界面。这使得界面的设计变得更加直观和易于理解。 OpenGL是一个用于开发图形应用程序的跨平台编程接口。它提供了一套功能强大的图形函数,可用于绘制2D和3D图形。OpenGL可以用于各种用途,如游戏开发、虚拟现实、数据可视化等。 在QML中使用OpenGL可以实现更高级的视觉效果和图形渲染。QML提供了一个OpenGL组件,可以轻松地将OpenGL内容嵌入到QML界面中。在QML中使用OpenGL,可以利用OpenGL的强大功能来实现复杂的图形效果和互动。 为了学习QML和OpenGL的结合使用,可以参考一些教程和文档。Qt官方网站提供了丰富的教程和示例,包括了使用QML和OpenGL的示例代码和文档。此外,还有一些第三方资源提供了有关QML和OpenGL的教程和示例代码。 学习QML和OpenGL的结合使用需要对QML和OpenGL的基础知识有一定的了解。首先,需要学习QML的语法和基本概念,如元素、属性和信号。然后,可以学习OpenGL的基本概念和函数,并了解如何在QML中使用OpenGL。 总之,QML和OpenGL的结合使用可以帮助我们创建更强大、更复杂的图形界面和视觉效果。通过学习相关教程和文档,我们可以掌握如何在QML中使用OpenGL,并利用其强大的功能来实现各种图形效果。 ### 回答2: QMl是一种用于创建用户界面的声明性语言,而OpenGL是一种用于实现3D图形渲染的开放图形库。结合起来,QML+OpenGL可以用于创建具有高效的3D图形渲染和动画效果的用户界面。 QML可以通过声明式的方式创建用户界面元素,并且具有良好的可视化能力和易于理解的语法。它支持丰富的UI控件和交互方式,同时还能轻松集成JavaScript代码来实现复杂的逻辑运算。在使用QML创建界面时,可以使用Qt Quick Controls提供的控件库或者自定义控件来满足特定需求。 而OpenGL是一种底层的图形库,用于实现高性能的3D图形渲染。通过OpenGL,可以直接进行硬件加速的图形操作,同时还可以利用图形硬件的强大计算能力,实现复杂的图形效果和计算。OpenGL提供了多种绘制图形的函数和接口,可以绘制点、线、多边形等不同类型的图形,并且可以进行纹理贴图、光照、阴影等高级渲染效果的实现。 QML+OpenGL的结合可以实现更为灵活且高效的用户界面设计。通过QML可以创建用户友好的界面元素,而OpenGL则可以在这些界面上实现更为复杂的3D图形渲染效果。在QML中,可以通过OpenGL的接口进行绘制和渲染操作,同时还可以将OpenGL渲染的结果嵌入到QML中,与其他界面元素进行交互。因此,通过学习QML+OpenGL教程,可以掌握如何使用QML和OpenGL结合起来创建出更为丰富和具有吸引力的用户界面。 ### 回答3: QML和OpenGL是两个不同的技术,但可以结合使用来创建各种交互式和图形密集型应用程序。下面是关于QML和OpenGL的简要介绍: QML是一种声明式的用户界面语言,用于创建功能丰富、跨平台的应用程序。它使用一种类似于JSON的语法来描述用户界面,可以通过编写更少的代码实现复杂的交互效果。QML具有良好的可扩展性和可重用性,并且易于理解和学习。它是Qt框架的一部分,因此可以与C++和其他Qt模块(如QtQuick)进行混合编程。 OpenGL是一种跨平台的图形库,用于渲染3D图形和执行其他图形操作。它提供了一套功能强大的API,可以绘制复杂的图形和执行高性能的计算。OpenGL可用于在各种设备上实现流畅的图形渲染,包括计算机、移动设备和嵌入式系统等。它支持多种图形效果,如阴影、反射、纹理映射和动画等。 QML和OpenGL可以结合使用来创建更具吸引力和交互性的用户界面。通过将QML和OpenGL结合起来,可以在QML界面中嵌入OpenGL渲染区域,并通过QML的声明式语法控制OpenGL渲染的效果和交互行为。这种混合编程的方法将QML的易用性和OpenGL的功能强大结合在一起,可以实现更高级的图形效果和用户交互。 总结而言,QML和OpenGL都是强大的技术,分别用于创建用户界面和图形渲染。结合使用它们可以实现各种复杂的应用程序,并为用户提供更好的视觉体验和交互性。如果您对QML和OpenGL有兴趣,可以参考官方文档和教程,以了解更多详细信息和开始使用它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文子阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值